此代码有效吗?
int foo()
{
std::vector<std::string>& v = std::vector<std::string>(5, "X");
// Do something silly...
return 42;
}
出于某种原因,我认为临时std::vector
对象(从分配标志右侧)应该在构造后立即被破坏(从而使引用无效)
然而,调试证明我错了,而且,我意识到我不太明白为什么在函数返回时会破坏临时变量。
我想我对一些基本的东西有很强烈的误解,所以请赐教:)
答案 0 :(得分:8)
您显示的代码是非法的 - 临时代码只能绑定到右值引用或 const 左值引用。
VC ++恰好允许它作为扩展名(并且a level 4 warning这样说)。
答案 1 :(得分:3)
临时的正常生命周期直到完全结束 创建它的表达式;它不一定是破坏的 立即使用。如果临时用于初始化引用, 它的寿命延长到与参考的寿命相匹配(与 在初始化列表中创建的临时的明显异常 构造函数)。
当然,你的代码是非法的;如果引用是非const,那么 只能用某种左值初始化。但如果是的话 合法的(并且至少有一个编译器接受它),生命周期应该是 扩展到与参考文献相匹配。
答案 2 :(得分:2)
您有一个对已释放对象的引用。它的工作原理是“纯粹的运气”(参见 The C ++ Programming Language ,第10.4.10节临时对象)。您无法保证它在每个编译器中都能正常工作。
如果临时的生命周期与const
引用绑定,则只能确定临时的生命周期。