为什么调用复制构造函数而不是转换构造函数?

时间:2012-06-27 08:20:45

标签: c++ copy-constructor

基本上这段代码:

class A {
};
class B { 
   B (const B& b) {}
public: 
   B (){}
   B (const A& a) {} 
};

int main()
{
   A a;
   B b1(a);  //OK
   B b2 = a; //Error
}

仅为B b2 = a生成错误。那个错误是

  

错误:'B :: B(const B&)'是私有的

除了直接转换构造函数之外,为什么还要尝试调用复制构造函数?

从错误消息中可以清楚地看到,创建了一个临时B,然后用于复制构建,但为什么呢?这个标准在哪里?

1 个答案:

答案 0 :(得分:14)

B b2 = a;

这称为 Copy Initialization

它确实如下:

  1. 使用Ba创建B (const A& a)类型的对象。
  2. 使用b2将创建的临时对象复制到B (const B& b)
  3. 使用~B()
  4. 销毁临时对象

    您得到的错误不是第1步,而是第2步。

      

    标准在哪里?

    C ++ 03 8.5初始化程序
    第14段:

      

    ....
       - 如果目标类型是(可能是cv限定的)类类型:
      ...
      ...
       - 否则(即,对于剩余的复制初始化情况),可以按照13.3中的描述枚举可以从源类型转换为目标类型或(当使用转换函数时)到其派生类的用户定义的转换序列。 .1.4,通过重载决策(13.3)选择最好的一个。如果转换不能完成或不明确,则初始化是错误的。选择的函数以初始化表达式作为参数调用;如果函数是构造函数,则调用初始化目标类型的临时函数。然后,根据上述规则,调用的结果(对于构造函数的情况是临时的)用于直接初始化作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除此直接初始化中固有的复制;见12.2,12.8。