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

时间:2017-01-09 15:40:00

标签: c++ c++11 constructor language-lawyer

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

T(const T&&) = default;

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

  

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

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

  

CWG 2171 C ++ 14
  X(const X&&) = default是微不足道的,是微不足道的。

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

1 个答案:

答案 0 :(得分:2)

来自n4296草案:

8.4.2.1明确默认的功能:

  

明确默认的功能

     

(1.1) - 是一个特殊的成员函数,

     

(1.2) - 具有相同的声明函数类型(可能除外)   不同的参考资格,除了复制的情况   构造函数或复制赋值运算符,参数类型可以是   “引用非const T”,其中T是成员的名称   函数的类)好像它已被隐式声明

     

(1.3) - 没有默认参数。

12.8.10复制和移动类对象:

  

类X的隐式声明的移动构造函数将具有该形式   X :: X(X&安培;&安培;)

结果是:

T(const T&&) = default;

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

T(T&&)