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

Luc*_*ore 22 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
}
Run Code Online (Sandbox Code Playgroud)

只生成一个错误B b2 = a.那个错误是

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

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

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

Alo*_*ave 14

B b2 = a;
Run Code Online (Sandbox Code Playgroud)

这称为复制初始化.

它确实如下:

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

您得到的错误不是在步骤1,而是在步骤2.

这个标准在哪里?

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

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