采用const参数的默认移动构造函数

wal*_*lly 5 c++ constructor language-lawyer c++11

定义一个类时,以下是否有效?

T(const T&&) = default;
Run Code Online (Sandbox Code Playgroud)

我在这里阅读有关移动构造函数的内容,它解释了如何隐式声明默认值:

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

在页面底部,它提到了缺陷报告CWG 2171:

CWG 2171 C++ 14
X(const X&&) = default是非常重要的,是微不足道的.

也许wiki条目只是有一个错误,CWG 2171只是指复制构造函数,而不是移动构造函数?

Edg*_*jān 3

来自 n4296 草案:

\n\n

8.4.2.1 显式默认函数:

\n\n
\n

明确默认的函数应

\n\n

(1.1) \xe2\x80\x94 是一个特殊成员函数,

\n\n

(1.2) \xe2\x80\x94具有相同的声明函数类型(除了可能不同的引用限定符,并且在复制构造函数或复制赋值运算符的情况下,参数类型可能是\n \ xe2\x80\x9c 对非常量 T\xe2\x80\x9d 的引用,其中 T 是成员\n 函数\xe2\x80\x99s 类的名称),就好像它已被隐式声明一样,并且

\n\n

(1.3) \xe2\x80\x94 没有默认参数。

\n
\n\n

12.8.10 复制和移动类对象:

\n\n
\n

类 X 的隐式声明的移动构造函数将具有以下形式\n X::X(X&&)

\n
\n\n
\n\n

结果该行:

\n\n
T(const T&&) = default;\n
Run Code Online (Sandbox Code Playgroud)\n\n

无效,因为隐式声明的移动构造函数具有以下形式:

\n\n
T(T&&)\n
Run Code Online (Sandbox Code Playgroud)\n