2

从复制构造函数的维基百科页面:

X a = X();     

// valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me)
// because the second wants a non-const X&
// to create a, the compiler first creates a temporary by invoking the default constructor
// of X, then uses the copy constructor to initialize as a copy of that temporary. 
// For some compilers both versions actually work but this behaviour should not be relied 
// upon because it's non-standard.

具体部分:

" 编译器首先通过调用 X 的默认构造函数来创建一个临时对象,然后使用复制构造函数将其初始化为该临时对象的副本。"

我的问题是(假设这是正确的)为什么会这样?从代码中,我猜编译器会在构造一个 X 后使用赋值运算符。

我猜是因为赋值发生在与初始化相同的表达式中?

另外,使用这个公式的原因是什么,而不仅仅是正常的初始化X a;或者你想复制X a(b);

4

2 回答 2

7

因为代码是在构造一个对象。这里的 = 符号是初始化,而不是分配。您只能分配给现有对象,而不能分配给正在构建的对象。

于 2013-02-01T00:40:18.703 回答
2

这只是理解 C++ 语法的问题。该语句X a = X();是带有初始化程序的声明语句,而不是赋值表达式。该语句的语法含义是声明一个a类型的变量X并从表达式中复制初始化它X()。这里不涉及任何分配。

于 2013-02-01T00:45:41.700 回答