char *不应该隐式转换为std :: string吗?

时间:2014-09-03 15:39:44

标签: c++

这是我的代码:

#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;
}

现在它编译。

2 个答案:

答案 0 :(得分:17)

§13.3.1.2 Operators in expressions [over.match.oper]州:

  

如果表达式中的运算符的操作数没有类型或枚举类型,则假定运算符是内置运算符,并根据第5章进行解释。

这正是你的情况:operator==的参数是指针,所以它被认为是内置的,编译器不会寻找可能的重载。

答案 1 :(得分:0)

绝对不是。

首先,您尝试使用指针代替引用。指针和引用之间的任何相似性都是实现细节。记住座右铭:“实施是不相关的!”

接下来,更直接的问题是,std :: string和char *是完全不同的,即使它们用于表示相同的东西。它们之间的转换是故意难以防止可互换地使用它们。