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

时间:2017-06-09 15:12:09

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

pmain的使用是否安全?我认为绑定mk_pair生成的临时文件的生命周期延长到p的生命周期,但是Wrap{1}Wrap{2}创建的临时对象如何?

struct Wrap { int &&x; };

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

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

int main(int argc, char *argv[])
{
  Pair &&p = mk_pair(Wrap{1},Wrap{2});
  std::cout << p.w1.x << ' ' << p.w2.x << '\n';
  return 0;
}

2 个答案:

答案 0 :(得分:4)

没有。 Wrap{1}Wrap{2}未绑定main中的自动引用,因此它们会在行尾被破坏。

Pair返回的mk_pair的有效期已延长至p,但其引用仍悬空。

答案 1 :(得分:2)

这是未定义的行为。在

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

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