我编写了以下程序,可以使用 EDG 编译,但被 gcc、clang 和 msvc 拒绝。 演示
struct C
{
C(const C&&) = default; // EDG: ok, gcc: No, Clang: No
};
int main()
{
}
据我所知,这应该可以编译,但所有三个主要编译器都拒绝它。只有 edg 接受它。 我想知道这里的标准一致行为是什么。
仅供参考,海湾合作委员会说:
<source>:3:4: error: defaulted declaration 'C::C(const C&&)' does not match the expected signature
3 | C(const C&&) = default;
| ^
<source>:3:4: note: expected signature: 'constexpr C::C(C&&)'
该程序格式良好,符合dcl.fct.def.default。
一个函数定义,其函数体的形式为 = default ;称为显式默认定义。显式默认的函数应:
- 是特殊成员函数[special]或比较运算符函数([over.binary]、[class.compare.default]),并且
这意味着如果
C(const C&&) = default;
是特殊成员函数或比较运算符函数,则程序将有效。
所以我们进入特别:
默认构造函数 ([class.default.ctor])、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符 ([class.copy.assign]) 和预期析构函数 ([class.dtor])特殊会员功能.
上面的意思是移动构造函数
C::C(const C&&)= default;
是一个特殊的成员函数。因此它可以被默认,因此程序是格式良好的。
请注意,
C::C(const C&&)
是一个移动向量,根据class.ctor:
类
的非模板构造函数是移动构造函数,如果其第一个参数的类型为 X&&、X
、易失性 X&& 或 const 易失性 X&&,并且没有其他参数或全部其他参数有默认参数([dcl.fct.default])。const X&&