const引用是否延长了临时对象返回的临时对象的生命周期?

时间:2016-05-02 12:35:57

标签: c++ lifetime rvalue temporary-objects reference-binding

我知道const引用会延长本地临时生命。现在我问自己这种适当性是否可以扩展到一系列临时对象上,也就是说,如果我可以安全地定义:

DoCmd.OpenForm FormName:="frmSearchAirport", View:=acNormal, OpenArgs:=0

我的感觉是,由于第一个方法std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2(); 已经返回一个临时对象,因此aBar.getTemporaryObject1()不适用。

3 个答案:

答案 0 :(得分:4)

仅当引用直接绑定到该临时值时,才会应用生存期扩展。

例如,从该引用初始化另一个引用不会执行另一个扩展。

但是,在您的代码中:

std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();

您将foo直接绑定到getTemporaryObject2()的返回值,假设它是一个按值返回的函数。这是否是另一个临时对象的成员函数或其他什么并没有区别。所以这段代码没问题。

getTemporaryObject1()返回的对象的生命周期没有扩展但是没关系(除非getTemporaryObject2的返回值包含对该对象的引用或指针,或者某些内容,但是因为它是显然是std::string,它不可能。)

答案 1 :(得分:3)

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的生命周期未延长。

答案 2 :(得分:0)

标题具有误导性。您不应该返回标题中所述的本地对象的引用,而是临时对象(按值返回)。

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");

只要函数按值返回,调用堆栈就无关紧要了。最后一个对象的生命周期将延长到它参考范围的生命周期。