为什么会这样:
#include <string> #include <iostream> using namespace std; class Sandbox { public: Sandbox(const string& n) : member(n) {} const string& member; }; int main() { Sandbox sandbox(string("four")); cout << "The answer is: " << sandbox.member << endl; return 0; }
给出以下输出:
答案是:
代替:
答案是:四
只有 本地 const参考才能延长使用寿命。
const
该标准在 拥抱8.5.3/5,[dcl.init.ref],关于引用声明的初始化程序的部分中指定了这种行为。您示例中的引用绑定到构造函数的参数,并且当对象绑定超出范围n时变得无效。n
n
生命周期扩展不能通过函数参数传递。搂12.2/5 [class.temporary]:
第二个上下文是引用绑定到临时的。引用绑定到的临时对象或作为临时对象绑定的子对象的完整对象的临时对象将在引用的生命周期内持续存在,除非下面指定。临时绑定到构造函数的ctor- initializer (拥抱12.6.2 [class.base.init]) 中的引用成员,直到构造函数退出。临时绑定到函数调用(拥抱5.2.2 [expr.call])中的引用参数,直到包含调用的完整表达式完成为止。