带const参数的默认移动构造函数

6

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

T(const T&&) = default;

我正在阅读有关移动构造函数的文章(链接在此)。文中解释了默认的移动构造函数仍然可能被隐式声明:

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

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

CWG 2171 C++14
X(const X&&) = default是非平凡的,现在变得是平凡的。

也许维基百科条目只是有错误,CWG 2171只涉及复制构造函数,而不是移动构造函数?

为什么它不会有效呢? - Lightness Races in Orbit
我认为这是有效的,但相当无用 - 你会如何从中移动? - SergeyA
1
@LightnessRacesinOrbit 我找不到一个可以编译它的编译器。 - wally
@SergeyA 我同意这是相当无用的。用户自定义的可能仍然有用途。但是关于有效性; 你能编译一个具有 X(const X&&) = default 的类吗? - wally
CWG在更新其问题列表的公共版本方面一直非常缓慢。这是作为Oulu的P0384R0的一部分移动的。 - T.C.
1
无论如何,现在已经修复。该问题的P/R有点误导,因为它似乎同样涉及复制/移动,但正如下面指出的[dcl.fct.def.default]/1.2所述,除了X&&之外,任何东西都不能是非用户提供的。 - T.C.
1个回答

3

来自n4296草案:

8.4.2.1 显式默认函数:

显式默认的函数应当

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

(1.2) - 具有相同的声明函数类型(除了可能存在不同的ref-qualifiers之外,并且在拷贝构造函数或拷贝赋值运算符的情况下,参数类型可以是“非const T的引用”,其中T是成员函数类的名称),就好像它是隐式声明的一样,并且

(1.3) - 不具有默认参数。

12.8.10 拷贝和移动类对象:

X类的隐式声明移动构造函数将采用以下形式X::X(X&&)


因此,该行代码:

T(const T&&) = default;

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

T(T&&)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接