我知道 const 引用可以延长本地临时对象的寿命。现在我问自己是否可以在一个临时对象链上扩展这种适当性,也就是说,如果我可以安全地定义:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
我的感觉是,由于第一种方法aBar.getTemporaryObject1()
返回的已经是一个临时对象,因此不适合aBar.getTemporaryObject2()
.
我知道 const 引用可以延长本地临时对象的寿命。现在我问自己是否可以在一个临时对象链上扩展这种适当性,也就是说,如果我可以安全地定义:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
我的感觉是,由于第一种方法aBar.getTemporaryObject1()
返回的已经是一个临时对象,因此不适合aBar.getTemporaryObject2()
.
生命周期延长仅适用于直接绑定到该临时的引用。
例如,从该引用初始化另一个引用不会进行另一个扩展。
但是,在您的代码中:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
您直接绑定foo
到 的返回值getTemporaryObject2()
,假设它是一个按值返回的函数。这是否是另一个临时对象的成员函数或其他任何东西都没有区别。所以这段代码是可以的。
返回的对象的生命周期getTemporaryObject1()
没有延长,但这并不重要(除非getTemporaryObject2
' 的返回值包含对该对象的引用或指针,或其他东西,但由于它显然是 a std::string
,它不能)。
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
是有效的(TemporaryObject2
被扩展但不是TemporaryObject1
)
std::string const& foo = aBar.getTemporaryObject1().member;
也是有效的(TemporaryObject1
被扩展)。
但
std::string const& foo = aBar.getTemporaryObject1().getReference();
无效:生命周期TemporaryObject1
未延长。
标题具有误导性。您不应该像标题中所述返回对本地对象的引用,而是临时对象(按值返回)。
string & foo1()
{
string tmp("hello");
return tmp;
}
string foo2()
{
string tmp("hello");
return tmp;
}
void foo3()
{
const string & r1 = foo1(); // crashes later.
const string & r2 = foo2(); // Ok, object lives in scope of foo3.
}
第二个电话不过是:
const string & r2 = string("hello");
只要函数按值返回,调用堆栈就无关紧要。最后一个对象的生命周期将扩展到其引用范围的生命周期。