例:
class Bar;
class Foo
{
public:
Foo(const Bar& bar) : mBar(&bar) {}
/* Other methods use mBar. */
private:
const Bar* mBar;
};
因此,目标是将const指针存储到某个外部对象,而不是存储外部对象内容的副本。
Foo(const Bar& bar)
将对象传递给构造函数的常用习惯用法,许多程序员会认为Foo会存储Bar的副本而不是指针/引用本身。
来电者可以暂时通过。这可以通过删除r值重载Foo(const Bar&&) = delete
来防止。然而,这不是万无一失的,因为您仍然可以通过一个带有const引用并返回const引用的函数来偷运临时对象。以Foo afoo(std::min(Bar{}, anotherBar));
为例。Foo(const Bar* bar)
必须检查nullptr,这是一个运行时检查,首选编译时机制。
仍然可以走私临时工:Foo afoo(&std::min(Bar{}, anotherBar));
以上哪个是首选,为什么?或者有没有更好的方法来做到这一点,没有上述问题?
你可以接受一个::std::reference_wrapper<Bar>
,它将处理传递rvalue的情况,并提供一个提示你正在复制包装而不是对象。