#include <iostream>
using namespace std;
class Src;//前值类型声明,因为在Dst中要用到Src类
class Dst{
public:
Dst(){
cout << "Dst::Dst()" << endl;
}
explicit //<1>不准用于自动类型转换
Dst(const Src& s){
cout << "Dst::Dst(const Src&)" << endl;
}
};
class Src{
public:
Src(){
cout << "Src::Src()" << endl;
}
//explicit //<2>不准用于自动类型转换
operator Dst() const{
cout << "Src::operator Dst called" << endl;
return Dst();
}
};
void Func(Dst d){}
int main(){
Src s;
Dst d1(s);//这是直接构造,不能视为类型转换
//以下语句均使用了自动类型转换,当构造函数、类型转换函数
//均使用了explicit声明时,它们就不能用于自动类型转换了,
//故下面的语句都不能通过编译!
Dst d2 = s;//ERROR!不能自动类型转换!
Func(s);//ERROR!不能自动类型转换!
//解决问题的办法:<1>和<2>处的explicit
//不能都去掉,也不能都保留,只留一个,就可以通过编译了
return 0;
}
两处的explicit都留的话,编译器会报错,英文大意是:不能进行自动类型转换。
只留<1>处的explicit运行结果是:
只留<2>处的explicit运行结果是:
两处的explicit都不留,依然可以通过编译: