const引用是否延长了临时对象返回的临时对象的寿命?
Does const reference prolong the life of a temporary object returned by a temporary object?
我知道 const 引用可以延长本地临时文件的寿命。现在我问自己是否可以在临时对象链上扩展这种礼节,也就是说,如果我可以安全地定义:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
我的感觉是,由于第一个方法 aBar.getTemporaryObject1()
returns 已经是一个临时对象,因此 aBar.getTemporaryObject2()
的礼节不成立。
仅当引用直接绑定到该临时文件时才适用生命周期延长。
例如,从该引用初始化另一个引用不会执行另一个扩展。
但是,在您的代码中:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
您直接将 foo
绑定到 getTemporaryObject2()
的 return 值,假设这是一个 return 按值计算的函数。这是否是另一个临时对象的成员函数或其他什么都没有关系。所以这段代码是可以的。
由 getTemporaryObject1()
编辑的对象 return 的生命周期没有延长,但这无关紧要(除非 getTemporaryObject2
的 return 值包含引用或指针到那个对象或其他东西,但因为它显然是一个 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
的生命周期未延长。
标题具有误导性。您不应该 return 引用 local object 如标题中所述,而是 temporary object(return 按值)。
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");
只要函数return按值,call-stack无所谓。最后一个 object 的 life-time 将扩展到其引用范围的 life-time。
我知道 const 引用可以延长本地临时文件的寿命。现在我问自己是否可以在临时对象链上扩展这种礼节,也就是说,如果我可以安全地定义:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
我的感觉是,由于第一个方法 aBar.getTemporaryObject1()
returns 已经是一个临时对象,因此 aBar.getTemporaryObject2()
的礼节不成立。
仅当引用直接绑定到该临时文件时才适用生命周期延长。
例如,从该引用初始化另一个引用不会执行另一个扩展。
但是,在您的代码中:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
您直接将 foo
绑定到 getTemporaryObject2()
的 return 值,假设这是一个 return 按值计算的函数。这是否是另一个临时对象的成员函数或其他什么都没有关系。所以这段代码是可以的。
由 getTemporaryObject1()
编辑的对象 return 的生命周期没有延长,但这无关紧要(除非 getTemporaryObject2
的 return 值包含引用或指针到那个对象或其他东西,但因为它显然是一个 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
的生命周期未延长。
标题具有误导性。您不应该 return 引用 local object 如标题中所述,而是 temporary object(return 按值)。
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");
只要函数return按值,call-stack无所谓。最后一个 object 的 life-time 将扩展到其引用范围的 life-time。