C++临时变量生命周期

Yip*_*Yay 5 c++ variables construction lifetime visual-studio

这段代码有效吗?

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

    // Do something silly...

    return 42;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我认为临时std::vector对象(从赋值标记开始)应该在构造之后被破坏(从而使引用无效).

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


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

ild*_*arn 8

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

VC++碰巧允许它作为扩展(并提供4级警告说明).

  • 请注意,如果它是*const引用*,则它是合法的.对于const引用,临时的**生命周期延长到const引用的生命周期**,恰好是函数的结束. (6认同)
  • @Yippie-Kai-Yay:在这种情况下,是的,确切地说 - VC++自己的框架(MFC/ATL)滥用了这个扩展.请注意,C++标准特别是_allows_语言扩展,只要编译器发出diagnostic_(在这种情况下是警告),就会启用其他不正确的代码进行编译.您只是没有看到诊断,因为默认警告级别为3.: - ] (4认同)
  • @Yippie-Kai-Yay:然后你应该建立启用4级警告.; - ] (2认同)