【问题标题】:Do compilers provide default move assignment operators and move constructors?编译器是否提供默认的移动赋值运算符和移动构造函数?
【发布时间】:2015-11-20 10:46:05
【问题描述】:

编译器(让我们以g++为例)在编写类时是否提供默认的移动构造函数和默认的移动赋值运算符?

编译器提供一个默认值:

  • 构造函数(无参数),除非声明了另一个带参数的构造函数。
  • 析构函数(大概什么都不做?-实际上不完全,这个问题有答案here,它调用基类析构函数)
  • 除非我们自己编写,否则复制构造函数
  • 复制赋值运算符,除非我们自己编写

编译器是否会提供默认的移动构造函数或移动赋值运算符。

【问题讨论】:

标签: c++11 move-semantics


【解决方案1】:

根据cppreference

隐式声明的移动构造函数

如果没有为类类型提供用户定义的移动构造函数 (结构、类或联合),并且以下所有内容都为真:

  • 没有用户声明的复制构造函数
  • 没有用户声明的复制赋值运算符
  • 没有用户声明的移动赋值运算符
  • 没有用户声明的析构函数 (直到 C++14)隐式声明的移动构造函数未定义为已删除,因为下一节中详述了条件

然后编译器会将移动构造函数声明为非显式 使用签名 T::T(T&&) 内联其类的公共成员。

一个类可以有多个移动构造函数,例如两者都 T::T(const T&&) 和 T::T(T&&)。如果存在一些用户定义的移动构造函数,则 用户仍然可以强制生成隐式声明的移动 带有关键字 default 的构造函数。

并根据cppreference

隐式声明的移动赋值运算符

如果没有为类提供用户定义的移动赋值运算符 类型(结构、类或联合),并且以下所有条件都为真:

  • 没有用户声明的复制构造函数
  • 没有用户声明的移动构造函数
  • 没有用户声明的复制赋值运算符
  • 没有用户声明的析构函数 (直到 C++14)隐式声明的移动赋值运算符不会被定义为已删除

然后编译器会将移动赋值运算符声明为内联 其类的公共成员,签名为 T& T::operator=(T&&)。

一个类可以有多个移动赋值运算符,例如两者兼而有之 T::operator=(const T&&) 和 T&T::operator=(T&&)。如果一些用户定义的 移动赋值运算符存在,用户仍然可以强制 生成隐式声明的移动赋值运算符 关键字默认值。

因为某些赋值运算符(移动或复制)总是被声明为 任何类,基类赋值运算符总是隐藏的。如果一个 using-declaration 用于从 基类,其参数类型可以与参数相同 派生类的隐式赋值运算符的类型, using-declaration 也被隐式声明所隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2013-03-16
    • 2017-05-15
    • 2020-09-06
    • 1970-01-01
    • 2015-07-10
    • 2021-08-18
    • 2016-09-13
    相关资源
    最近更新 更多