C++中隐式转换有几种:首先只有一个参数的构造函数可以将参数类型的对象转换为类类型对象,其次通过在类里面定义转换函数可以将类类型转换为其他类型,下面主要讨论第二种转换及几个问题。
通过隐式转换能带来很多好处:如下例子
struct PS:pair<string,string>
{
PS():pair<string,string>(string(),string()){}
PS(const string& s):pair<string,string>(s,s){
sort(first.begin(),first.end());
}
operator string() const{return second;}
};
通过构造函数PS(const string& s)以及转换函数operator string() const可以实现PS和string之间的相互转换,这能带来很多好处,例如用于copy函数中:
typedef istream_iterator<string> string_input;
vector<PS> word_pairs;
copy(string_input(ifs),string_input(),back_inserter(word_pairs));//发生隐式类型转换,string转为PS
copy(word_pairs.begin(),word_pairs.end(),ostream_iterator<string>(cout," "));发生转换,PS转为string
隐式转换注意的方面:转换函数不能有返回值,不能有形参。不能进行多参次的转换。
下面讨论隐式转换的几个问题:
1.隐式转换不参与模板实参的推导(来自帖子)
template <typename T>
class A {
};
class StringValue {
public:
operator A<int>() const {
return A<int>();
}
};
template <typename T>
void f(A<T>) {
}
void f2(A<int>) {
}
int main()
{
StringValue sv;
f(sv); // ERROR
f2(sv); // OK
}
2.求解释的问题
class StringValue {
private:
string _rawValue;
public:
StringValue(){
_rawValue="hello";
}
operator string() const {
return _rawValue;
}
};
void func(string str)
{
cout<<"hello"<<endl;
}
void main()
{
StringValue sv;
func(sv);//通过编译
sv+="hello";//error,编译失败
cout << string(sv); // 可以输出_rowValue
cout<<sv; // 编译失败,没有重载的<<接受StringValue为参数
}
但是将转换为string改为int就可以通过编译了,
operator int() const { // 用来演示
return 0;
}
int data=0;
data+=sv;//right
cout<<data;//right
帖子里有人用上面的隐式转换不能参与模板实参推导解释此问题,可感觉解释不通,求高人解答。