5

此代码有效吗?

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

    // Do something silly...

    return 42;
}

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

但是,调试证明我错了,好吧,我意识到我不太明白为什么函数返回时临时变量会被破坏。


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

4

3 回答 3

8

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

VC++ 恰好允许它作为扩展(并给出4 级警告)。

于 2012-05-10T18:34:29.570 回答
3

临时的正常生命周期是直到创建它的完整表达式结束为止;它不一定在使用时立即销毁。如果使用临时对象来初始化引用,则它的生命周期会延长以匹配引用的生命周期(在构造函数的初始化列表中创建的临时对象除外)。

当然,你的代码是非法的;如果引用是一个非常量,它只能用某种左值来初始化。但如果它是合法的(并且至少有一个编译器接受它),则应该延长生命周期以匹配引用的生命周期。

于 2012-05-10T18:56:33.997 回答
2

您有一个对已释放对象的引用。它靠“纯粹的运气”工作(参见The C++ Programming Language,第 10.4.10 节临时对象)。你不能保证它会在每个编译器中工作。

const只有绑定到引用时,您才能确定临时对象的生命周期会延长。

于 2012-05-10T18:42:22.813 回答