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


以上是函数可以通过const引用*不*接受临时变量作为参数来接受参数吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>