当前位置: 首页 > news >正文

右值生命周期的延长

第一个例子:

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将参数转化为了右值引用。


http://www.mrgr.cn/news/29026.html

相关文章:

  • linux gcc 静态库的简单介绍
  • 代码随想录打卡Day35
  • 计数服务怎么设计?
  • 【读书】原则
  • 牛客周赛 Round 60(A,B,C,D,E,F)
  • 等保测评:企业如何建立安全的开发环境
  • MyBatis 源码解析:Mapper 文件加载与解析
  • C++知识点示例代码助记
  • leetcode 42 接雨水
  • 深入解析:如何通过网络命名空间跟踪单个进程的网络活动(C/C++代码实现)
  • Java项目——苍穹外卖(一)
  • 01Frenet与Cardesian坐标系(基础知识)
  • echarts 自定义标注样式自定义tooltip弹窗样式
  • Linux | 进程间通信:管道、消息队列、共享内存与信号量
  • 815. 公交路线(24.9.17)
  • Cesium绘制可编辑线
  • Zabbix的安装与基本使用(主机群组、应用集、监控项、触发器、动作、媒介)
  • 【Android】Handler用法及原理解析
  • 实时数仓3.0DWD层
  • Python 入门教程(3)基础知识 | 3.5、运算符