如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化

If Move semantics(Move constructor and Move assignment operator) are not defined does compiler optimize by default?

本文关键字:Move 编译器 是否 默认 优化 语义 定义 构造函数 如果没有 赋值操作符      更新时间:2023-10-16

在定义类时,如果我们忘记写Move构造函数和Move赋值操作符,编译器会自动优化和添加。

也许是,也许不是。这不是编译器是否足够聪明的问题,而是您还记得或忘记定义了哪些其他特殊的成员函数。编译器隐式定义move构造函数的确切条件列在§12.8/9 [class.copy]

如果类X的定义没有显式声明move构造函数,则当且仅当
X没有用户声明的复制构造函数
X没有用户声明的拷贝赋值操作符
X没有用户声明的move赋值操作符,
- X没有用户声明的析构函数

类似地,隐式生成move赋值运算符的条件列在§12.8/20

如果类X的定义没有显式声明move赋值操作符,当且仅当
X没有用户声明的复制构造函数
X没有用户声明的move构造函数
X没有用户声明的拷贝赋值操作符,
- X没有用户声明的析构函数