C++11 常数数据成员阻止自动生成复制和移动系数?
考虑以下类别:C++11 常数数据成员阻止自动生成复制和移动系数?,c++11,constants,copy-constructor,move-semantics,move-constructor,C++11,Constants,Copy Constructor,Move Semantics,Move Constructor,考虑以下类别: struct A { int const x; A(int x) : x(x) { } } 该类是否会自动生成移动和复制复制复制器?或者这是因为存在const字段成员x 根据我的经验,答案是不会生成move和copy构造函数,但我在标准中没有明确提到这一点。标准中是否有任何内容暗示在这种情况下,不会生成移动和复制CTOR 当然,同样的问题也适用于移动/复制作业。复制和移动构造函数将声明为默认值,而不是定义为已删除(即,将生成它们)。它们将具有预期的行为(
struct A
{
int const x;
A(int x) : x(x) { }
}
该类是否会自动生成移动和复制复制复制器?或者这是因为存在const
字段成员x
根据我的经验,答案是不会生成move和copy构造函数,但我在标准中没有明确提到这一点。标准中是否有任何内容暗示在这种情况下,不会生成移动和复制CTOR
当然,同样的问题也适用于移动/复制作业。复制和移动构造函数将声明为默认值,而不是定义为已删除(即,将生成它们)。它们将具有预期的行为(回想一下,非类类型的“移动构造函数”对源对象没有影响) 根据[class.copy]/23: 如果
X
具有[…],则类X
的默认复制/移动赋值运算符定义为已删除
非类类型(或其数组)[……]的非静态数据成员const
复制和移动构造函数将声明为默认值,而不是定义为已删除(即,将生成它们)。它们将具有预期的行为(回想一下,非类类型的“移动构造函数”对源对象没有影响) 根据[class.copy]/23: 如果
X
具有[…],则类X
的默认复制/移动赋值运算符定义为已删除
非类类型(或其数组)[……]的非静态数据成员const
移动构造函数做什么?它从moved from对象中复制(即使用复制ctor)数据成员
const
。@becko对于非类对象,复制和移动之间没有区别,因此是的。int
只是数据成员的一种示例类型。但如果这是一门复杂的课,我的问题是正确的。如果数据成员是const
,则自动移动构造函数只能复制数据成员,对吗?移动构造函数不会在const
对象上调用,因为移动构造函数的签名是T(T&&other)
,而不是T(const T&other)
@rlbond几乎-如果构造函数T(const T&other)提供了
,则正式成为移动构造函数;但是,它必须是一个非常奇怪的类。move构造函数是做什么的?它从moved from对象中复制(即使用复制ctor)数据成员const
。@becko对于非类对象,复制和移动之间没有区别,因此是的。int
只是数据成员的一种示例类型。但如果这是一门复杂的课,我的问题是正确的。如果数据成员是const
,则自动移动构造函数只能复制数据成员,对吗?移动构造函数不会在const
对象上调用,因为移动构造函数的签名是T(T&&other)
,而不是T(const T&other)
@rlbond几乎-如果构造函数T(const T&other)提供了
,则正式成为移动构造函数;不过,这一定是一门非常奇怪的课。