22

所以基本上这段代码:

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

4

1 回答 1

14
B b2 = a;

这称为复制初始化

它执行以下操作:

  1. 通过使用创建一个类型的B对象。aB (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。

于 2012-06-27T08:22:58.953 回答