c++11新特性之移动构造是如何实现的

一些背景知识

了解c++的左值和右值

一句话描述:

  • 左值 (lvalue, locator value) 表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。

  • 右值 (rvalue) 则使用排除法来定义。一个表达式不是 左值 就是 右值 。 那么,右值是一个 不
    表示内存中某个可识别位置的对象的表达式。
    深度理解可以参考该链接:https://nettee.github.io/posts/2018/Understanding-lvalues-and-rvalues-in-C-and-C/

c++11的折叠引用

c++11可以使用左值引用,type &引用名 = 左值表达式;以及右值引用,type &&引用名 = 右值表达式;
c++11特性-折叠引用原理:

  1. 右值引用与右值引用折叠为右值引用,也即X&& &&折叠成X&&,用于处理右值
  2. 其他情况下,折叠为左值引用,也即X& &、X&& &、X& &&都折叠成X&,用于处理左值

remove_reference

remove_reference的作用是去掉了类型的左值引用和右值引用,直接返回类型的基本内容。
remove_reference的源码

template<typename _Tp>
struct remove_reference
{
    typedef _Tp   type; };

template<typename _Tp>
struct remove_reference<_Tp&>
{
    typedef _Tp   type; };

template<typename _Tp>
struct remove_reference < _Tp&& >
{
    typedef _Tp   type; };

也就是说,remove_reference 实际上是封装了一个模板类,根据传入的类型匹配对应的数据结构体,而remove_reference::type总能返回类型的基本内容。

static_cast

任何具有明确定义的类型转换,但static_cast 也不能用来去掉表达式的 const 修饰和 volatile 修饰。换句话说,不能将 const/volatile 类型转换为非 const/volatile 类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值