为什么在这种情况下不调用赋值运算符而支持复制构造函数?

时间:2013-02-01 00:37:48

标签: c++ oop

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

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);

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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