我不明白为什么在将e添加到c时为什么调用了复制构造函数。
struct A {};
struct B {
B() { std :: cout << "B Constructor" << std :: endl; }
B(const A&) { std :: cout << "B Copy" << std :: endl;}
const B operator +(const B& arg);
};
const B B::operator +(const B& arg) {
std :: cout << "+" << std :: endl;
return B();
}
int main() {
B c;
A e;
c + e;
}
答案 0 :(得分:2)
不是要调用副本构造函数,而是
B(const A&);
复制构造函数始终具有这样的签名:
B(const B&);
由于您没有提供,编译器会为您生成一个副本构造函数,但实际上并没有调用它:您有一个operator+
的{{1}},它接受一个{{1} },但另一个操作数的类型为B
。由于首先提到的构造函数(const B&
是隐式,所以可以解决-从名为A
的{{1}}对象实例化一个临时B(const A&)
,并调用运算符。
要使示例中的输出更加直观,请考虑将构造函数B
更改为
A