const char *和字符串比较如何在C ++中工作?

时间:2014-09-17 07:10:19

标签: c++ operator-overloading stdstring

请考虑以下代码段:

#include <iostream>
int main() {
    std::string str = "Hello";
    const char *cstr = "Hello";
    if (cstr == str) {
        std::cout<<"Both are same string.";
    }
    return 0;
}

我很难猜测const char *和字符串比较是如何工作的:

if (cstr == str) {

根据我的理解,使用 str 作为参数调用左操作数的重载运算符(在本例中为 cstr )。现在没有为const char *重载 == 。那么上述比较如何起作用呢?

如果比较是 str == cstr ,我就没有接受它的问题(因为==对于std :: string重载并且它接受const char *作为参数进行比较)。

注意: - 我正在使用gcc-4.8.1编译上面的代码。

2 个答案:

答案 0 :(得分:3)

来自http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

比较basic_string对象和以空值终止的T

数组
template< class CharT, class traits, class Alloc >
bool operator==(const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs);
template< class CharT, class traits, class Alloc >
bool operator==(const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs);

...

答案 1 :(得分:2)

  

根据我的理解,使用str作为参数调用左操作数的重载运算符(在本例中为cstr)。现在没有为const char *重写==。

运算符实际上是std :: string,概念上看起来与此类似:

bool operator==(const char* const lhs, const std::string& rhs);

(尽管事实上它是模板化的。)

这个std :: string运算符是专门为你提到的操作添加的(比较std :: string和char *,当比较时提供char *作为左侧操作数)。 / p>

  

如果比较是str == cstr,我就没有接受它的问题(因为==对于std :: string重载并且它接受const char *作为参数进行比较)。

两者都存在(特别是为了支持这种情况)。