在C ++中比较字符串对象和字符串文字:为什么没有编译错误?

时间:2013-02-25 09:36:27

标签: c++ string compiler-errors

我写了一些这样的代码:

#include<string>  
using namespace std;  
int main() {  
    string str;
    ...
    if(str=="test")    //valid????
        //do something
    ...
    return 0;
}

稍后重新阅读代码后,我很好奇编译器是如何给出错误的? 注意:我已经检查了引用,看起来应该存在某种类型不匹配错误(将字符串对象与char数组进行比较)

编辑:抱歉= = = =错字。它已经修复了

编辑2:问题:

  • 没有任何运算符==(字符串,字符*)或 operator ==(string,char [])或类似的运算符 参考(cppreference.com)
  • 没有转化运营商 char *或char []到字符串

4 个答案:

答案 0 :(得分:3)

正如其他人所提到的,单=符号执行分配,而不是比较。

但是,operator overloading定义了比较运算符,就像赋值一样,是C ++最基本的功能之一。

表达式str = "test"转换为函数调用str.operator= ("test"),表达式str == "test"将转换为str.operator== ("test")operator==(str,"test"),无论哪一个的工作原理。

即使没有为std::stringchar *的操作数定义重载函数,编译器仍会尝试查找函数以将参数转换为与此类函数匹配的类型

编辑:是的,std::string无法转换为bool,因此if条件仍然是错误的。我认为这是一个为这个问题制作一个很好的片段的工件。

答案 1 :(得分:2)

if(str="test")  //it's an assignment not a comparison.

将其更改为if(str=="test")

 why no compile errors?

因为它不是c ++。 std::string已定义此==运算符。

if(str="test")  //it's an error: because you can't convert string to boolean type. 
                  which is expected as condition.

error like :could not convert 's.std::basic_string<_CharT, _Traits, _Alloc>::operator=
<char, std::char_traits<char>, std::allocator<char> >(((const char*)"p"))' from 
'std::basic_string<char>' to 'bool' 

答案 2 :(得分:0)

如果你这样做

if(str="test"){}

您将“test”分配给str。由于这是一个有效的操作,因此赋值将返回&str对象的引用,因此将始终满足您的if条件。当然,如果str == 0则会出错。 做得更好:

if(str == "test"){}

感谢James Kanze!

答案 3 :(得分:0)

如上所述,由于运算符重载,它不是编译错误(忽略了您不进行比较而是分配的事实)。如果您使用没有此运算符的任何对象,那么,是的,这将是编译错误:

// Foo does not have comparision operator
struct Foo {};

// Bar have comparision operator
struct Bar
{
    // Next line is the operator overload.
    bool operator ==(const char *pstr) const { return true; };
};

// string have comparision operator
std::string Test("test");

if (Foo == "test")  // compilation error
if (Bar == "test")  // uses the Bar::operator ==
if (Test == "test") // uses the basic_string<char>::operator ==
{ /* do something */ }