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

Why is copy constructor called instead of conversion constructor?

本文关键字:构造函数 转换 复制 为什么 调用      更新时间:2023-10-16

所以基本上这个代码:

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,然后将其用于复制构造,但为什么呢?这在标准中在哪里?

B b2 = a;

这称为复制初始化

它执行以下操作:

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

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

这在标准中在哪里?

C++03 8.5 初始值设定项
第14段:

....
— 如果目标类型是(可能符合 cv 条件的)类类型:
...
...
— 否则(即,对于剩余的复制初始化情况),如 13.3.1.4 中所述枚举用户定义的转换序列,这些转换序列可以从源类型转换为目标类型或(使用转换函数时)转换为其派生类,并通过重载分辨率 (13.3) 选择最佳转换序列。如果转换无法完成或不明确,则初始化格式不正确。使用初始值设定项表达式作为其参数调用所选函数;如果函数是构造函数,则调用将初始化目标类型的临时函数。然后,调用的结果(构造函数情况的临时结果)用于根据上述规则直接初始化作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除此直接初始化中固有的复制;参见 12.2、12.8。