我是对的,这是(摘自this GotW):
string f() { return "abc"; }
void g() {
const string& s = f();
cout << s << endl; // can we still use the "temporary" object?
}
完全没问题,但这根本不行:
const string& foo() { string x{"abc"}; return x; }
void bar() {
const string& y = foo();
}
为什么会有所不同?可以说“临时的生命周期不会扩展到函数调用(即使绑定到const ref)”吗? 或者是什么解释,为什么第一个是好的,但不是第二个?
答案 0 :(得分:2)
第一个很好,因为返回的值(这是一个临时的)直接绑定到const的引用,然后临时的生命周期延长到引用的生命周期。
请注意,在第二种情况下没有临时值,x
是一个局部变量,当它离开函数时将被销毁,然后该函数将始终返回一个悬空引用;该引用用于初始化y
,但没有任何变化,y
也将是一个悬空引用。