这是代码合法吗?
int foo()
{
std::vector<std::string>& v = std::vector<std::string>(5, "X");
// Do something silly...
return 42;
}
出于某种原因,我认为临时std::vector
对象(右从分配标志)应当破坏它的结构之后(从而使参考无效)。
然而,调试证明我是错的,那么,我意识到,我不太明白为什么临时变量被破坏了函数返回时。
我想我有一些基本的东西很强的误解,所以请赐教:)
还有你的代码是非法的-临时对象只能绑定到右值引用或const左值引用。
VC ++恰好允许它作为一个扩展(并给出了一个4级警告这样说)。
一个临时的正常寿命,直到其被创建的完整表达式的结尾; 它不一定立即销毁上使用。 如果临时用来初始化一个参考,它的寿命延长到匹配参考的(在构造函数初始化列表中创建一个临时的显着的例外)。
当然,你的代码是非法的; 如果参考是一个非const,它只能与某种左值的初始化。 但是,如果它是合法的(和至少一个编译器接受它),则寿命应扩大到匹配参考的。
你必须解除分配的对象的引用。 其工作原理是“侥幸”(见C ++编程语言 ,部分10.4.10临时对象)。 你不能保证它会在每个编译工作。
你只能肯定的是,如果它绑定到一个临时的寿命延长const
参考。