p
中main
的使用是否安全?我认为绑定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;
}
答案 0 :(得分:4)
没有。 Wrap{1}
和Wrap{2}
未绑定main
中的自动引用,因此它们会在行尾被破坏。
Pair
返回的mk_pair
的有效期已延长至p
,但其引用仍悬空。
答案 1 :(得分:2)
这是未定义的行为。在
mk_pair(Wrap &&w1, Wrap &&w2)
你将w1
和w2
作为右值引用,没关系,你将生命延伸到函数中。然后返回引用这些引用的对象。问题是当表达式结束时,那些通过引用传递的临时值被销毁。这意味着您知道有引用过期对象的引用,并且使用这些引用是未定义的行为。