临时子表达式的临时生命周期,绑定到引用
Posted
技术标签:
【中文标题】临时子表达式的临时生命周期,绑定到引用【英文标题】:Lifetime of a temporary with temporary subexpressions, bound to a reference 【发布时间】:2017-06-09 15:12:09 【问题描述】:p
在main
中的以下使用安全吗?我相信绑定mk_pair
产生的临时对象的生命周期延长到p
,但是Wrap1
和Wrap2
创建的临时对象呢?
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】:没有。 Wrap1
和 Wrap2
未绑定到 main
中的自动引用,因此它们在行尾被破坏。
从mk_pair
返回的Pair
的生命周期延长到p
,但它的引用是悬空的。
【讨论】:
【参考方案2】:这是未定义的行为。在
mk_pair(Wrap &&w1, Wrap &&w2)
您将w1
和w2
作为右值引用,这没关系,您可以延长函数的寿命。然后返回一个引用这些引用的对象。问题是当表达式结束时,您通过引用传递的那些临时对象被销毁。这意味着您知道有引用过期对象的引用,并且使用这些引用是未定义的行为。
【讨论】:
以上是关于临时子表达式的临时生命周期,绑定到引用的主要内容,如果未能解决你的问题,请参考以下文章
阐明在函数签名中将两个对不同范围的引用对象的引用绑定到相同生命周期的含义
当它绑定到调用函数中的 const 引用时,它的返回值的生命周期如何扩展到调用函数的范围?