C++临时变量的生命周期

https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary

当临时对象被绑定到引用的时候,引用会延长临时对象的生命周期,临时对象的生命周期将会跟引用的生命周期一样。但也有例外的情况:

不会扩展对return语句中函数的返回值的临时绑定:它会在返回表达式的末尾立即销毁。 这样的函数总是返回一个悬空引用。

譬如

const int & retRef() {

    return 1;

}

const int & a = retRef();

这种情况a将会是一个空悬指针,俗称野指针。

绑定到构造函数初始构造列表中的引用成员的临时绑定仅在构造函数退出之前持续存在,而不是在对象生命周期存在,构造函数退出后就不存在了。(c++14之后不适用)

构造函数的初始化构造列表:

struct S 
{    
  int n;    
  S(int); // constructor declaration    
  S() : n(7) {} // constructor definition.                 
  // ": n(7)" is the initializer list                  
  // ": n(7) {}" is the function body
};
S::S(int x) : n{x} {} // constructor definition. ": n{x}" is the initializer list

如果函数参数为引用,当临时对象绑定到该参数上时,其生命期一直持续到包含该函数调用的表达式的结束,如果该函数又返回了引用,则在表达式结束之后,该引用成为空悬引用:

const S & test(const S &a) {
  a.do_something();
  return a;
}

临时对象绑定到new表达式中使用的初始化列表引用,则其生命期直到包含该new-expression的完整表达式结束,而不是初始化对象。 在表达式结束之后,则其引用成员将成为悬空引用。
a temporary bound to a reference in a reference element of an aggregate initialized using direct-initialization syntax (parentheses) as opposed to list-initialization syntax (braces) exists until the end of the full expression containing the initializer.
临时对象绑定到使用直接初始化语法(括号)聚合初始化的引用元素中的引用,而不是列表初始化语法(大括号),生命期只能延续到包含初始化程序的完整表达式结束之前。

struct A {
  int&& r;
};
A a1{7}; // OK, lifetime is extended
A a2(7); // well-formed, but dangling reference

通常,临时的生命周期不能通过“传递”来进一步扩展:从临时绑定的引用初始化的第二个引用不会影响其生命周期,譬如:A是临时对象的引用,B是A的引用,B的生命周期并不会影响临时对象的生命周期。

仅在函数形参声明,函数返回类型声明,类成员声明,以及带 extern 说明符时,引用可以不与初始化器一同出现。(也就是说在其他情况,引用必须被初始化)

你可能感兴趣的:(C++临时变量的生命周期)