0

例子:

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 的副本而不是指针/引用本身。
    • 调用者可以通过一个临时的。这可以通过删除右值重载来防止Foo(const Bar&&) = delete。然而,这并不是万无一失的,因为您仍然可以通过一个接受 const 引用并返回 const 引用的函数来偷运临时对象。Foo afoo(std::min(Bar{}, anotherBar));例如。
  • 通过 const 指针传递:Foo(const Bar* bar)
    • 必须检查 nullptr,这是一个运行时检查,编译时机制是首选。
    • 仍可临时走私:Foo afoo(&std::min(Bar{}, anotherBar));

以上哪个是首选,为什么?或者有没有更好的方法来做到这一点,不会受到上述问题的影响?

4

1 回答 1

1

您可以接受 a ::std::reference_wrapper<Bar>,它将通过传递一个右值来处理大小写,并提供一个提示,表明您要复制包装器而不是对象。

于 2019-04-20T16:21:16.470 回答