一个函数可以通过 const 引用*而不*接受临时变量作为参数吗?
Can a function take an argument by const reference *without* accepting temporaries as an argument?
激励示例:
假设我们有一个 class Foo
和一个 class ObservesFoo
,它们有一个指向 Foo
实例的非拥有指针。我们可以这样写:
class Foo {};
class ObservesFoo
{
Foo* p_foo = nullptr;
ObservesFoo(Foo* t_foo) : p_foo(t_foo) { }
};
但也许我不认为 nullptr
是 p_foo
的有效值。我可以为 ObservesFoo
编写一个不同的构造函数来强制执行此要求,而无需执行诸如 t_foo
无效时抛出的操作:
ObservesFoo(Foo& t_foo) : p_foo(&t_foo) { }
然后我对自己说,“等一下,这个构造函数不会 改变 t_foo
。我不应该把它当作 const Foo&
?”但是如果我这样写这个函数,它可能会接受一个临时的 Foo
作为它的参数,它的生命周期会在构造函数返回后立即结束,这将消除我从确保 p_foo
不是 nullptr
,因为现在它很容易成为悬挂指针。
有没有一种干净的方法来获得 Foo&
构造函数和 const Foo&
构造函数之间的中间地带?
假设 const
不会干扰您使用该对象的方式,并且您永远不需要重新绑定正在观察的对象,并且保证观察到的 Foo 实例比其观察者活得更久,那么参考将起作用。
如果删除对 Foo 进行右值引用的构造函数,将防止您提到的意外生命周期延长:
class ObservesFoo
{
Foo const& p_foo;
ObservesFoo(Foo const& t_foo) : p_foo(t_foo) { }
ObservesFoo(Foo&& t_foo) = delete;
};
激励示例:
假设我们有一个 class Foo
和一个 class ObservesFoo
,它们有一个指向 Foo
实例的非拥有指针。我们可以这样写:
class Foo {};
class ObservesFoo
{
Foo* p_foo = nullptr;
ObservesFoo(Foo* t_foo) : p_foo(t_foo) { }
};
但也许我不认为 nullptr
是 p_foo
的有效值。我可以为 ObservesFoo
编写一个不同的构造函数来强制执行此要求,而无需执行诸如 t_foo
无效时抛出的操作:
ObservesFoo(Foo& t_foo) : p_foo(&t_foo) { }
然后我对自己说,“等一下,这个构造函数不会 改变 t_foo
。我不应该把它当作 const Foo&
?”但是如果我这样写这个函数,它可能会接受一个临时的 Foo
作为它的参数,它的生命周期会在构造函数返回后立即结束,这将消除我从确保 p_foo
不是 nullptr
,因为现在它很容易成为悬挂指针。
有没有一种干净的方法来获得 Foo&
构造函数和 const Foo&
构造函数之间的中间地带?
假设 const
不会干扰您使用该对象的方式,并且您永远不需要重新绑定正在观察的对象,并且保证观察到的 Foo 实例比其观察者活得更久,那么参考将起作用。
如果删除对 Foo 进行右值引用的构造函数,将防止您提到的意外生命周期延长:
class ObservesFoo
{
Foo const& p_foo;
ObservesFoo(Foo const& t_foo) : p_foo(t_foo) { }
ObservesFoo(Foo&& t_foo) = delete;
};