gpt4 book ai didi

c++ - 一个函数可以通过 const 引用*而不*接受临时变量作为参数吗?

转载 作者:行者123 更新时间:2023-12-04 00:50:18 27 4
gpt4 key购买 nike

激励示例:

假设我们有一个类 Foo 和一个类 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 不会干扰您使用该对象的方式,并且您永远不需要重新绑定(bind)正在观察的对象,并且保证观察到的 Foo 实例比其观察者活得更久,然后引用将起作用。

如果你删除了对 Foo 进行右值引用的构造函数,你将防止你提到的意外生命周期延长:

class ObservesFoo
{
Foo const& p_foo;

ObservesFoo(Foo const& t_foo) : p_foo(t_foo) { }
ObservesFoo(Foo&& t_foo) = delete;
};

关于c++ - 一个函数可以通过 const 引用*而不*接受临时变量作为参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67168016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com