为什么以下默认复制语法在 C++ 中无效?

Why is the following default copying syntax invalid in C++?

我编写了一个简单的 C++ 程序来测试 C++ 中默认复制行为的概念。所以,我有一个示例 class X,我创建了一个名为 "var" 的对象 class X,然后我尝试用 "var" 初始化另一个名为 "defaultCopyObject" 的对象假设默认复制行为只是一个对象到另一个对象的成员复制。我已经正确理解了这个概念,但我无法理解用于初始化的语法。

X defaultCopyObject{var};// this code snippet works perfectly fine

// this code snippet returns a compile time error
X defaultCopyObject;
defaultCopyObject{var};

谁能解释一下为什么前者有效而后者无效?

第一个是初始化列表构造函数或默认构造函数(如果初始化列表不存在)。在声明这样的对象后,您不能调用构造函数,这就是代码正在做的事情

X defaultCopyObject{var}; 调用 X 的构造函数。构造函数只能在变量首次实例化时调用。

第二个例子中,变量在调用defaultCopyObject{var};时已经实例化,因此无法再次调用构造函数

请注意,变量实例化后,您仍然可以使用复制赋值运算符

defaultCopyObject = var;

Brace initialization syntax 喜欢

X defaultCopyObject{var};

仅在声明变量时有效,之后无法使用它。

您需要适当的赋值运算符,以将值移动到变量。有一些方法(比如从 std::initializer_list 分配),但不使用那种为声明保留的语法。