-->

C ++临时变量寿命(C++ temporary variable lifetime)

2019-06-24 07:41发布

这是代码合法吗?

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

    // Do something silly...

    return 42;
}

出于某种原因,我认为临时std::vector对象(右从分配标志)应当破坏它的结构之后(从而使参考无效)。

然而,调试证明我是错的,那么,我意识到,我不太明白为什么临时变量被破坏了函数返回


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

Answer 1:

还有你的代码是非法的-临时对象只能绑定到右值引用或const左值引用。

VC ++恰好允许它作为一个扩展(并给出了一个4级警告这样说)。



Answer 2:

一个临时的正常寿命,直到其被创建的完整表达式的结尾; 它不一定立即销毁上使用。 如果临时用来初始化一个参考,它的寿命延长到匹配参考的(在构造函数初始化列表中创建一个临时的显着的例外)。

当然,你的代码是非法的; 如果参考是一个非const,它只能与某种左值的初始化。 但是,如果它是合法的(和至少一个编译器接受它),则寿命应扩大到匹配参考的。



Answer 3:

你必须解除分配的对象的引用。 其工作原理是“侥幸”(见C ++编程语言 ,部分10.4.10临时对象)。 你不能保证它会在每个编译工作。

你只能肯定的是,如果它绑定到一个临时的寿命延长const参考。



文章来源: C++ temporary variable lifetime