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

2411d,右值与移动

原文

概述

添加语言内部__rvalue(Expression)函数,指示对匹配函数参数,按右值对待.这在用非引用语义调用函数时启用移动语义.

移动语义运行时和资源效率可取的,因为可移动资源新对象,而不是复制然后析构.其他语言(如C++)有流行移动语义.

先前的工作

C++移动语义这里
RustC++移动语义对比这里
C++语义有害(Rust更好)这里

描述

语法

RvalueExpression是个附加PrimaryExpression:

RvalueExpression:
    __rvalue ( AssignExpression )

重载

如果同时有引用非引用参数重载,则偏爱匹配右值非引用参数,而偏爱左值引用参数匹配.RvalueExpression最好与非引用参数匹配.

右值参数匹配参数语义

调用函数拥有对待右值参数.因此,如果左值与右值参数匹配,则会给函数传递左值副本.然后,在函数结束时该函数对(如果有)参数调用析构器.

不会复制右值参数,因为按唯一假设它,且在函数结束时也会析构它.编译器会自动函数体附加析构.

函数无法知道其参数源右值还是左值的副本.

即在函数返回时,__rvalue(左值式)参数析构式.不能继续使用左值式.在传递给函数后,编译器并不总是可检测到使用,即对象的析构器必须按其初值或至少是良性值,重置对象的内容.

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      //在此添加:`'p=null;'`
    }
}
void aggh(S s)
{
}
void oops()
{
    S s;
    s.p = cast(ubyte*)malloc(10);
    aggh(__rvalue(s));
    free(s.p); //错误,两次释放`s.p`
}

__rvalue移动赋值

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      p = null;
    }
    void opAssign(S s)
    {
        this.p = s.p;
        s.p = null;
    }
}
void oops()
{
    S s;
    s.p = cast(ubyte*)malloc(10);
    S t;
    t = __rvalue(s);
}

__rvalue移动构造

struct S
{
    ubyte* p;
    ~this()
    {
      free(p);
      p = null;
    }
    this(S s)
    {
        this.p = s.p;
        s.p = null;
    }
}
void oops()
{
    S s;
    S t = __rvalue(s);
}

http://www.kler.cn/a/389180.html

相关文章:

  • 【日志】392.判断子序列
  • 链游系统定制化开发:引领游戏产业的新时代
  • Kafka参数了解
  • hadoop大数据平台
  • 一文详解java的数据类型
  • 【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解
  • linux入门教程:perl库
  • 【刷题12】ctfshow刷题
  • 面试官:进程与线程的关系和区别到底是什么?
  • 大数据学习10之Hive高级
  • 【从零开始的LeetCode-算法】540. 有序数组中的单一元素
  • 营收增长,净利润却暴跌695.9%,昆仑万维在赌什么?
  • 后端-内连接(INNER JOIN),左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)的区别
  • 【Vue】-组件开发-一个树组件
  • jpeg2000dataset.cpp:40:10: fatal error:
  • 【网络安全】Java线程安全及非线程安全
  • 使用GPT-SoVITS训练语音模型
  • 浅谈C++ MFC
  • iview图片放大缩小旋转预览功能
  • 【eNSP】企业网络架构实验——vlan间的路由通信(三)
  • 【万字详解】如何在微信小程序的 Taro 框架中设置静态图片 assets/image 的 Base64 转换上限值
  • IntelliJ IDEA超详细下载安装教程(附安装包)
  • 计算机网络(3)
  • 【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案
  • Day42 | 动态规划 :选或不选 打家劫舍打家劫舍II
  • java基础面试题六集合框架