临时子表达式的临时生命周期,绑定到引用

Posted

技术标签:

【中文标题】临时子表达式的临时生命周期,绑定到引用【英文标题】:Lifetime of a temporary with temporary subexpressions, bound to a reference 【发布时间】:2017-06-09 15:12:09 【问题描述】:

pmain 中的以下使用安全吗?我相信绑定mk_pair产生的临时对象的生命周期延长到p,但是Wrap1Wrap2创建的临时对象呢?

struct Wrap  int &&x; ;

struct Pair  Wrap &&w1, &&w2; ;

Pair mk_pair(Wrap &&w1, Wrap &&w2)  return Pairstd::move(w1),std::move(w2); 

int main(int argc, char *argv[])

  Pair &&p = mk_pair(Wrap1,Wrap2);
  std::cout << p.w1.x << ' ' << p.w2.x << '\n';
  return 0;

【问题讨论】:

【参考方案1】:

没有。 Wrap1Wrap2 未绑定到 main 中的自动引用,因此它们在行尾被破坏。

mk_pair 返回的Pair 的生命周期延长到p,但它的引用是悬空的。

【讨论】:

【参考方案2】:

这是未定义的行为。在

mk_pair(Wrap &&w1, Wrap &&w2)

您将w1w2 作为右值引用,这没关系,您可以延长函数的寿命。然后返回一个引用这些引用的对象。问题是当表达式结束时,您通过引用传递的那些临时对象被销毁。这意味着您知道有引用过期对象的引用,并且使用这些引用是未定义的行为。

【讨论】:

以上是关于临时子表达式的临时生命周期,绑定到引用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们可以非常量引用临时对象并延长其生命周期?

阐明在函数签名中将两个对不同范围的引用对象的引用绑定到相同生命周期的含义

C++17 和静态临时生命周期的引用扩展

当它绑定到调用函数中的 const 引用时,它的返回值的生命周期如何扩展到调用函数的范围?

当它被绑定到调用函数中的const引用时,它的返回值的生命周期如何扩展到调用函数的范围?

OSGi:没有生命周期管理的服务绑定