这是我的代码:
#include <iostream>
using namespace std;
struct ST {};
bool operator==(const struct ST *s1, const string &s2) {
return true;
}
int main() {
struct ST *st = new ST();
const char *p = "abc";
if (st == p) {
return 0;
}
return 1;
}
我收到编译错误:
prog.cpp:14:12: error: comparison between distinct pointer types ‘ST*’ and ‘const char*’ lacks a cast [-fpermissive]
if (st == p) {
^
我想知道为什么从char *到string的隐式转换在这里不起作用?
UPDATE 安东的回答很有意义,我更新了代码:
#include <string>
using namespace std;
struct ST {};
bool operator==(const struct ST s1, const string &s2) {
return true;
}
int main() {
struct ST st;
const char *p = "abc";
if (st == p) {
return 0;
}
return 1;
}
现在它编译。
答案 0 :(得分:17)
§13.3.1.2 Operators in expressions [over.match.oper]州:
如果表达式中的运算符的操作数没有类型或枚举类型,则假定运算符是内置运算符,并根据第5章进行解释。
这正是你的情况:operator==
的参数是指针,所以它被认为是内置的,编译器不会寻找可能的重载。
答案 1 :(得分:0)
绝对不是。
首先,您尝试使用指针代替引用。指针和引用之间的任何相似性都是实现细节。记住座右铭:“实施是不相关的!”
接下来,更直接的问题是,std :: string和char *是完全不同的,即使它们用于表示相同的东西。它们之间的转换是故意难以防止可互换地使用它们。