是否默认的默认移动构造函数是用户声明的?

voi*_*ter 8 c++ c++11

问题是我的头衔.

我问,因为我有一个带有默认移动构造函数的类,但是试图执行复制赋值的代码失败,说明复制赋值运算符被删除(根据Visual Studio 2015).

所以我在这里检查了隐式声明的复制赋值运算符的规则:

类T的隐式声明或默认的复制赋值运算符被定义为删除以下任何一种情况:

  • ...
  • T有一个用户声明的移动构造函数
  • T有一个用户声明的移动赋值运算符

所以基本上我不确定默认的移动构造函数是否算作用户声明的.我的直觉告诉我是的,但是当谈到标准时,我总是喜欢确定,因为假设可能代价高昂.

Elo*_*eth 4

标准说:

12.8 复制和移动类对象[class.copy]

如果类定义没有显式声明复制构造函数,则隐式声明一个。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;否则,它被定义为默认(8.4)。如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用后一种情况。

如果类定义没有显式声明复制赋值运算符,则隐式声明一个。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制赋值运算符被定义为已删除;否则,它被定义为默认(8.4)。如果类具有用户声明的复制构造函数或用户声明的析构函数,则不推荐使用后一种情况。

您的类具有默认的移动构造函数,但它是显式声明的。因此根据标准,隐式声明的复制构造函数和复制赋值运算符被定义为删除。

8.4.2 显式默认函数 [dcl.fct.def.default]

显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1 12.4、12.8),这可能意味着将它们定义为已删除。如果函数是用户声明的并且在第一次声明时未显式默认或删除,则该函数是用户提供的。用户提供的显式默认函数(即,在第一次声明后显式默认)是在显式默认的位置定义的。

使用此术语,您的移动构造函数是用户声明的,但不是用户提供的。