N3290 C ++草案,§12.2,第5点,第10行。
第二个上下文是引用绑定到临时的。该 临时引用的临时或临时的 引用绑定到的子对象的完整对象 在参考文件的生命周期内持续存在,除了:
临时绑定到new-initializer中的引用(5.3.4) 一直持续到包含完整表达式的完整表达式 新初始化。 [例如:
struct S { int mi; const std::pair<int,int>& mp; }; S a { 1, {2,3} }; S* p = new S{ 1, {2,3} };// Creates dangling reference
- 结束示例] [注意:这可能会引入一个悬空参考, 并且鼓励实现在这样的情况下发出警告 案件。 - 结束说明]
与C ++ 03相比,这是一个补充点。但这个例子对我来说是不可理解的。你能用其他任何例子解释这一点吗?
我知道悬空引用和临时对象是什么,std::pair
包含两个可能不同数据类型的值。
答案 0 :(得分:7)
Temporaies一般只持续到它们在以下位置创建的表达式的结尾:
#include <complex>
void func()
{
std::complex<int> a; // Real variable last until the end of scope.
a = std::complex<int>(1,2) + std::complex<int>(3,4);
// ^^^^^^^^^^^^^^^^^^^^^^ Creates a temporary object
// This is destroyed at the end of the expression.
// Also note the result of the addition creates a new temporary object
// Then uses the assignment operator to change the variable 'a'
// Both the above temporaries and the temporary returned by '+'
// are destroyed at ';'
如果您创建临时对象并将其绑定到引用。您将其寿命延长到与其绑定的参考相同的寿命。
std::complex<int> const& b = std::complex<int>(5,6);
// ^^^^^^^^^^^^^^^^ Temporary object
// ^^^^ Bound to a reference.
// Will live as long as b lives
// (until end of scope)
此规则的例外情况是临时绑定到新初始值设定项中的引用。
S* p1 = new S{ 1, {2,3} };
// This is the new C++11 syntax that does the `equivalent off`:
S* p2 = new S {1, std::pair<int,int>(2,3) };
// ^^^^^^^^^^^^^^^^^^^^^^^ Temporary object.
// This lives until the end of the
// expression that belongs to the new.
// ie the temporary will be destroyed
// when we get to the ';'
但是在这里我们将新的临时对象绑定到成员
const std::pair<int,int>& mp;
这是一个const引用。但它所绑定的临时对象将在';'处被销毁。在上面的表达式中,当你尝试在后续表达式中使用它时,mp将引用一个不再存在的对象。
}