[英]C++ temporary variable lifetime
这段代码有效吗?
int foo()
{
std::vector<std::string>& v = std::vector<std::string>(5, "X");
// Do something silly...
return 42;
}
出于某种原因,我认为临时的std::vector
对象(从赋值符号右侧)应该在构造之后被破坏(从而使引用无效) 。
然而,调试证明我错了,而且,我意识到我不太明白为什么在函数返回时会破坏临时变量。
我想我对一些基本的东西有很强的误解,所以请赐教:)
您显示的代码是非法的 - 临时代码只能绑定到右值引用或const左值引用。
VC ++碰巧允许它作为扩展(并提供4级警告说明)。
临时的正常生命周期直到创建它的完整表达式结束; 它不一定在使用时立即被破坏。 如果临时用于初始化引用,则延长其生命周期以匹配引用的生命周期(具有在构造函数的初始化程序列表中创建的临时的明显例外)。
当然,你的代码是非法的; 如果引用是非const,则只能使用某种左值初始化。 但如果它是合法的(并且至少有一个编译器接受它),则应该延长生命周期以匹配引用的生命周期。
您有一个对已释放对象的引用。 它的工作原理是“纯粹的运气”(参见C ++编程语言 ,第10.4.10节临时对象)。 你无法保证它在每个编译器中都能正常工作。
您只能确定临时的生命周期是否已扩展,如果它绑定到const
引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.