基本上是这样的代码:
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;
这被称为Copy Initialization。
它执行以下操作:
B
从a
创建类型为B (const A& a)
的对象。b2
将创建的临时对象复制到B (const B& b)
。~B()
销毁临时对象。您得到的错误不在步骤1,而是在步骤2。
标准位置在哪里?
C ++ 03 8.5初始化程序第14段:
....—如果目标类型是(可能是cv限定的)类类型:......—否则(例如,对于其余的复制初始化情况),如13.3所述,列举了可以从源类型转换为目标类型或(当使用转换功能时)为其派生类的用户定义转换序列.1.4,最好的方法是通过过载分辨率(13.3)选择。如果转换无法完成或模棱两可,则初始化格式错误。所选函数以初始化器表达式作为参数进行调用;如果函数是构造函数,则调用将初始化目标类型的临时类。然后,根据上面的规则,调用的结果(对于构造方法来说是临时的)用于直接初始化作为复制初始化目标的对象。在某些情况下,允许通过将中间结果直接构造到要初始化的对象中来消除此直接初始化中固有的复制。参见12.2,12.8。