如果未定义Move语义(Move构造函数和Move赋值运算符),编译器是否默认优化?

时间:2014-08-06 17:55:31

标签: c++ c++11 compiler-construction compiler-optimization move-semantics

在定义类时,如果我们忘记编写Move构造函数和Move赋值运算符,编译器就足够聪明,可以自动优化和添加。

1 个答案:

答案 0 :(得分:3)

也许,也许不是。这不是编译器是否足够智能,而是您记住或忘记定义的其他特殊成员函数的问题。 §12.8/ 9 [class.copy]

中列出了编译器隐式定义移动构造函数的确切条件
  

如果类X的定义没有明确声明一个移动构造函数,那么当且仅当有一个构造函数时,它将被隐式声明为默认值    - X没有用户声明的复制构造函数,
   - X没有用户声明的副本赋值运算符,
   - X没有用户声明的移动赋值运算符,以及
   - X没有用户声明的析构函数。

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

  

如果类X的定义没有明确声明一个移动赋值运算符,那么当且仅当有一个时,将隐式声明一个默认值    - X没有用户声明的复制构造函数,
   - X没有用户声明的移动构造函数,
   - X没有用户声明的复制赋值运算符,以及
   - X没有用户声明的析构函数。