下面一段代码为什么没有发送隐式转化,莫非是string类有什么限制吗

C++语言 码拜 9年前 (2016-06-02) 1230次浏览
#include <string>
using namespace std;
struct C
{
operator const char *(){return “”;}
operator string(){return “”;}
};
int main()
{
string str;
const char *cstr;
C c;
c==cstr;//OK
c==str;// 编译报错
}
///c==str 为什么没有隐式转化呢?莫非是string有什么限制吗?
解决方案

5

2

原因是 string 已经重载了 operator ==
string的  operator == 匹配失败后,
并不进行先, 隐式转换为string,
再跟 operator == 匹配 了
假如是 == 则可以先转换

7

对于表达式

c==str

编译器会查找
1. c.operator=(str)
2. operator=(c, str)
3. 语言内建运算符,例如 bool operator==(cosnt char *, const char*)
对于右边 const char * 的情况,匹配到第三类, c 被转换到 const char *
对于右边是 string 的情况,第一类是没有的,第二类和第三类找不到合适的
第三类没有合适的原因楼上都说了,string 不能直接转换为 const char *
第二类没有合适的原因是,和 string 相关的几个 operator== 都是模板,要使用这些运算符重载必须进行模板函数特化,这时必须将模板参数全部推断出来。但表达式 c 的类型为 C ,并不能从中推导出模板需要的参数,此时模板参数推导失败,该模板不列入备选。
几个相关的模板如下:

// C 不是 const basic_string<chart, traits, Allocator> ,也不是其子类
template<class charT, class traits, class Allocator> bool operator==(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs) noexcept;
// C 不是 const CharT*
template<class charT, class traits, class Allocator> bool operator==(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs);

6

原因是string的==重载是模板重载,模板参数推断无法使const basic_string<CharT,Traits,Alloc>&匹配C(http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp)。
加一个string的特例化==重载就可以了:bool operator == (const string &, const string &) { … }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明下面一段代码为什么没有发送隐式转化,莫非是string类有什么限制吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)