复制构造函数有以下定义:
类
X
的非模板构造函数是一个复制构造函数 第一个参数的类型为X&
,const X&
,volatile X&
或const volatile X&,
并且要么没有其他参数,要么全部 其他参数有默认参数(8.3.6)。
请注意,定义与convertions
无关,但以下程序运行正常:
#include <iostream>
struct B{ };
struct A : B
{
A(){ }
A(const B&){ }
};
B b;
A a = b;
int main(){ }
并生成输出
B()
B()
A(const B&)
我不清楚,我预计程序不会打印A(const B&)
,因为定义A(const B&)
不是复制构造函数,因此一个被隐含地定义为A::A(const A&)
默认初始化,不会产生任何副作用。
难道你不能澄清这个原因的错误吗?
答案 0 :(得分:1)
A a = b;
这会调用A类的转换构造函数。
A(const B&){ } << This is conversion constructor for class A which defines conversion from B to A
和我们宣布的一样
A(int i) {} << Convert int to class A object.
即使你删除了A类和B类之间的关系,它也会导致构造函数调用。
答案 1 :(得分:1)
这称为转换构造函数(第12.3.1节)。 b
已复制初始化为a
,并且A::A(const B&)
被选中以执行转换。转换结果用于直接初始化a
。