const 数据成员阻止自动生成复制和移动 ctors?

A const data member prevents automatic generation of both copy and move ctors?

考虑以下 class:

struct A 
{ 
    int const x;
    A(int x) : x(x) { }  
}

这个 class 会自动生成移动和复制 ctors 吗?或者这是由于 const 字段成员 x 的存在而阻止的?

根据我的经验,答案是不会生成移动和复制 ctors,但我没有在标准中明确提及这一点。标准中是否有任何内容暗示在这种情况下不会生成移动和复制 ctors?

当然,同样的问题也适用于 move/copy 作业。

复制和移动构造函数将被声明为默认的,而不是被定义为删除的(即它们将被生成)。它们将具有预期的行为(回想一下非类类型的“移动构造函数”对源对象没有影响)。

根据 [class.copy]/23:

,复制和移动赋值运算符将被声明为默认值,但将被定义为已删除

A defaulted copy/move assignment operator for class X is defined as deleted if X has [...]

  • a non-static data member of const non-class type (or array thereof) [...]