Gcc 和 clang 拒绝使用 =default

问题描述 投票:0回答:1

我编写了以下程序,可以使用 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&&)'
c++ language-lawyer c++23
1个回答
0
投票

该程序格式良好,符合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&&、
const X&&
、易失性 X&& 或 const 易失性 X&&,并且没有其他参数或全部其他参数有默认参数([dcl.fct.default])。

© www.soinside.com 2019 - 2024. All rights reserved.