概述:
惯性的认为编译器会将const char * 转换成string 类型,实则不然,标准转换认为离const char * 最接近的是bool。
现象:
实现了一个接口类,包含了类似以下的接口:
class
{
public:
void Set(const std::string&value);
void Set(const int&value);
void Set(const double&value);
void Set(const bool&value);
};
当我在程序中调用该方法时,发现,最终匹配竟是bool类型的重载版本:
Set("value");
分析:
分析一下过程:
“value” 会被编译器认为是const char * 类型,注意,不是string,因为从const char * 到 string类型需要程序员进行转换,这不属于标准转换;
观察其他重载版本 int double 以及bool ,标准转换认为将const char * 转换成bool是最接近的类型。
所以,最终我的程序中调用了bool的重载版本,而不是string。
解决:
为const char *类型提供自己的重载版本,即添加以下函数:
void Set(const char*value)
{
Set(std::string(value));
}
用户使用时:
std::string value = "1234";
Set(value);
不用怀疑,调用的是void Set(const std::string&value); 版本重载,因为类型能匹配上
Set("123");
这里调用的是const char *版本重载在这里插入代码片 ,在该版本中,会显式的将const char *转换成string ,最终匹配到void Set(const std::string&value);
|