将const引用/指针传递给要存储的类的首选方法,而不是复制引用的对象

时间:2019-04-20 16:12:34

标签: c++ const-reference const-pointer

示例:

class Bar;

class Foo
{
public:

    Foo(const Bar& bar) : mBar(&bar) {}

    /* Other methods use mBar. */

private:

    const Bar* mBar;
};

因此,目标是存储指向某个外部对象的const指针,而不是存储外部对象内容的副本。

  • 通过const参考传递:Foo(const Bar& bar)
    • 将对象传递给构造函数的常用习惯,许多程序员会认为Foo将存储Bar的副本,而不是指针/引用本身。
    • 呼叫者可以传递一个临时呼叫。可以通过删除r值重载Foo(const Bar&&) = delete来防止这种情况。但是,这并不是万无一失的,因为您仍然可以通过接受const引用并返回const引用的函数来临时走私。例如Foo afoo(std::min(Bar{}, anotherBar));
  • 通过const指针传递:Foo(const Bar* bar)
    • 必须检查nullptr,这是运行时检查,首选编译时机制。
    • 仍然可以临时走私:Foo afoo(&std::min(Bar{}, anotherBar));

以上哪个是首选,为什么?还是有没有更好的方法来解决上述问题呢?

1 个答案:

答案 0 :(得分:1)

您可以接受::std::reference_wrapper<Bar>,它将通过传递右值来处理情况,并提示您打算复制包装器而不是对象。