C ++临时变量生命周期

时间:2012-05-10 18:32:49

标签: c++ visual-studio variables lifetime construction

此代码有效吗?

int foo()
{
    std::vector<std::string>& v = std::vector<std::string>(5, "X");

    // Do something silly...

    return 42;
}

出于某种原因,我认为临时std::vector对象(从分配标志右侧)应该在构造后立即被破坏(从而使引用无效)

然而,调试证明我错了,而且,我意识到我不太明白为什么在函数返回时会破坏临时变量。


我想我对一些基本的东西有很强烈的误解,所以请赐教:)

3 个答案:

答案 0 :(得分:8)

您显示的代码是非法的 - 临时代码只能绑定到右值引用或 const 左值引用。

VC ++恰好允许它作为扩展名(并且a level 4 warning这样说)。

答案 1 :(得分:3)

临时的正常生命周期直到完全结束 创建它的表达式;它不一定是破坏的 立即使用。如果临时用于初始化引用, 它的寿命延长到与参考的寿命相匹配(与 在初始化列表中创建的临时的明显异常 构造函数)。

当然,你的代码是非法的;如果引用是非const,那么 只能用某种左值初始化。但如果是的话 合法的(并且至少有一个编译器接受它),生命周期应该是 扩展到与参考文献相匹配。

答案 2 :(得分:2)

您有一个对已释放对象的引用。它的工作原理是“纯粹的运气”(参见 The C ++ Programming Language ,第10.4.10节临时对象)。您无法保证它在每个编译器中都能正常工作。

如果临时的生命周期与const引用绑定,则只能确定临时的生命周期。