关于C++中隐式转换

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


帖子里有人用上面的隐式转换不能参与模板实参推导解释此问题,可感觉解释不通,求高人解答。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值