Any*_*orn 15 c++ const reference lifetime
我的代码看起来像这样:
class T {};
class container {
const T &first, T &second;
container(const T&first, const T & second);
};
class adapter : T {};
container(adapter(), adapter());
Run Code Online (Sandbox Code Playgroud)
我认为不断引用的生命周期将是容器的寿命.但是,否则看起来,在创建容器后销毁适配器对象,留下悬空引用.
什么是正确的寿命?
适配器临时对象的堆栈范围是容器对象或容器构造函数的范围?
如何正确实现绑定临时对象到类成员引用?
谢谢
Mic*_*urr 17
根据C++ 03标准,根据上下文,对引用的临时绑定具有不同的生命周期.在您的示例中,我认为下面突出显示的部分适用(12.2/5"临时对象"):
除了下面指定的内容之外,引用绑定的临时对象或作为临时绑定对象的子对象的完整对象的临时对象的生命周期仍然存在.绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.在函数调用(5.2.2)中与引用参数的临时绑定将持续存在,直到包含该调用的完整表达式完成为止.
因此,绑定临时是一种延长临时对象生命周期的高级技术(GotW#88:候选者对于"最重要的const"),在这种情况下显然不会帮助你.
在另一方面,埃里克Niebler有,你可能会感兴趣的是讨论一个有趣的(如果曲)技术,它可以让你的类的构造函数推断是否临时对象(实际上是一个右值)已经传递给它(并因此将文章必须被复制)或传递的非临时(左值)(因此可能安全地将参考藏匿而不是复制):
祝你好运 - 每当我读到这篇文章时,我都要完成所有工作,好像我以前从未见过这些材料一样.它只与我一起度过一段短暂的时刻......
我应该提一下,C++ 0x的右值引用应该使Niebler的技术变得不必要.MSVC 2010将支持Rvalue引用,计划在一周左右发布(如果我没记错的话,将于2010年4月12日发布).我不知道在GCC中rvalue引用的状态是什么.
临时const引用仅具有当前语句的生命周期(即,它们在分号之前超出范围).因此,经验法则永远不会依赖于在接收它作为参数的函数的生命周期之外存在的const-reference,在这种情况下,它只是构造函数.所以一旦构造函数完成,不要依赖任何const引用仍然存在.
对于临时工具,无法更改/覆盖/延长此生命周期.如果您想要更长的生命周期,请使用实际对象而不是临时对象:
adapter a, b;
container(a, b); // lifetime is the lifetime of a and b
Run Code Online (Sandbox Code Playgroud)
或者更好的是,只是不要对类成员使用常量引用,除非在最严峻的情况下,对象非常密切相关且绝对不是临时的.