您的位置:首页 > 财经 > 金融 > 右值生命周期的延长

右值生命周期的延长

2024/11/18 7:32:38 来源:https://blog.csdn.net/kitesxian/article/details/142306459  浏览:    关键词:右值生命周期的延长

第一个例子:

output:

result()创建了一个临时对象,它是一个右值,通过结果我们可以看到直到main函数结束时这个对象才调用了析构函数;

result()返回右值,我们的代码将这个右值绑定到了一个右值引用的变量r,这一行为(将右值绑定到右值引用的行为)延长了这个右值的生命周期到r变量的结束(也就是这里的main函数结束)。


第二个例子:

output:

即:result()创建的临时对象在16行结束后就销毁了------调用了析构函数。std::move()返回的是右值引用。我们前面提到:右值被绑定到一个右值引用后,前者生命周期得到延长,具体延长到和后者一样。但是我们这个例子是右值引用到右值引用的绑定,这并不会延长临时对象的生命周期,更让人头大的是,在16行结束,由于临时对象的析构,r 变量反而成了一个dangling ref(悬空引用),这可能会导致未定义行为。


第三个例子:

output:

同理,右值引用到const &依然不会延长临时对象的生命周期。


PS1:move返回右值引用。
这是move源码实现:

template <class _Ty>
_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movablereturn static_cast<remove_reference_t<_Ty>&&>(_Arg);
}

我们可以看到,static_cast将参数转化为了右值引用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com