函数可以通过const引用*不*接受临时变量作为参数来接受参数吗?
激励示例:
假设我们有一个类Foo和一个ObservesFoo具有指向 a 实例的非拥有指针的类Foo。我们可以这样写:
class Foo {};
class ObservesFoo
{
Foo* p_foo = nullptr;
ObservesFoo(Foo* t_foo) : p_foo(t_foo) { }
};
但也许我不认为nullptr这是一个有效的价值p_foo。我可以编写一个不同的构造函数来ObservesFoo强制执行此要求,而无需执行诸如 throw if t_foois invalid 之类的操作:
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;
};