You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带const的默认移动构造函数被GCC等拒绝,标准合规性如何?

关于C++中const C&&默认移动构造函数的标准合规性问题

我编写了如下C++代码,它可通过EDG编译,但被GCC、Clang和MSVC拒绝:

struct C
{
   C(const C&&) = default; // EDG: 编译通过,GCC/Clang/MSVC: 编译失败
};
int main()
{
    
}

我原本认为这段代码应该能正常编译,但三大主流编译器均拒绝它,只有EDG接受。我想了解符合C++标准的行为是什么。

GCC的错误提示如下:

<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++标准的规定,类的默认移动构造函数的签名必须是T(T&&),不允许在右值引用参数前添加const限定符。

当你声明C(const C&&) = default;时,这并不符合标准定义的默认移动构造函数的合法签名。标准明确要求,默认移动构造函数的参数必须是非const的右值引用——移动操作的核心是转移对象的资源所有权,这必然需要修改被移动的对象,而const右值引用无法支持这种修改,因此标准不允许将此类声明标记为默认函数(= default)。

EDG的行为不符合C++标准,而GCC、Clang和MSVC的拒绝是正确的,它们严格遵循了标准对默认移动构造函数签名的要求。如果你确实需要一个接受const C&&的构造函数,不能将它声明为默认函数,必须手动编写函数体。

内容的提问来源于stack exchange,提问作者user20562802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:10:57