带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
相关产品推荐
相关产品推荐

