一个函数可以通过 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) { }
};

但也许我不认为 nullptrp_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;
};