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

时间:2015-08-26 18:56:06

标签: c++ copy copy-constructor

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

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

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

有人可以解释一下为什么前一个声明有效而后者无效?

3 个答案:

答案 0 :(得分:5)

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

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

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

defaultCopyObject = var;

答案 1 :(得分:3)

如果初始化列表一不存在,则第一个是初始化列表构造函数或默认构造函数。在声明这样的对象之后,你无法调用构造函数,这就像代码所做的那样

答案 2 :(得分:0)

Brace initialization syntax喜欢

X defaultCopyObject{var};

仅在声明变量时有效,而在不可能之后使用它。

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