#include<iostream>
using namespace std;
struct A {
public:
A(int) {
cout<<"ctor"<<endl;
}
//private:
A(const A&) {
cout<<"copy"<<endl;
}
};
int main() {
A a(123);
A b = 123; // error
A c = { 123 };
A d{123}; // c++11
return 0;
}
输出:
ctor
ctor
ctor
ctor
分析:
A a(123):构造函数
A c = { 123 }:构造函数
A d{123}:构造函数
A b = 123:
1)A tmp(123),将123隐式转换为A(调用构造函数),创建临时对象tmp。
2)A b=tmp,调用拷贝构造函数,完成赋值。
但是,编译器通过优化可以绕过拷贝构造函数(c++primer 5th P442),让tmp作为需要的对象返回。此时虽然绕过了拷贝构造函数,但要求拷贝构造函数是存在且可访问的。