p1
和p2
指向相同的字符串内容,以下代码会比较不同的地址。
const char *p1 = "abc";
const char p2[] = {'a', 'b', 'c', '\0'};
cout << (p1 == p2) << endl; // 0 (false)
但是当我根据p2
构建字符串变量时,比较p1
和字符串变量会产生1
而不是0
。
string s1(p2);
cout << (p1 == s1) << endl; // 1 (true)
我的问题是:字符串类的构造函数将const char*
作为唯一参数,告诉编译器转换 a {{1}在可能的情况下串起来:
const char*
为什么编译器不会将string (const char* s);
转换为临时字符串变量,然后使用字符串类中定义的运算符将其与p2
进行比较:
p1
答案 0 :(得分:2)
那是因为c ++可以比较两个const char*
变量p1
和p2
(换句话说,p1==p2
是一个有效的c ++语句,没有任何字符串转换),语义是看它们是否是相同的物理地址(在你的例子中,它们不是,因此返回false
。)
答案 1 :(得分:1)
编译器不会调用operator==
重载,因为它不能 - 如果表达式中至少有一个类型具有类或枚举类型,则操作符的重载解析只会启动。
来自C ++ 11 draftn3290§13.3.1.2运算符表达式:
如果表达式中的运算符的操作数没有类型或枚举类型,则假定运算符是内置运算符,并根据第5章进行解释。
(第5节在第5.10节中定义==
,其中包括通常的指针比较语义。)
因此甚至没有考虑过载。你只是不能仅在内置类型上重载运算符。