0

我写了一些这样的代码:

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

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

编辑:抱歉 = to == 拼写错误。它已经修复了

编辑2:问题:

  • 参考文献中没有定义任何 operator==(string,char*) 或 operator==(string,char[]) 或类似的运算符(cppreference.com)
  • 没有从 char* 或 char[] 到字符串的转换运算符
4

4 回答 4

3

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

但是比较运算符和赋值一样,是通过运算符重载来定义的,这是 C++ 最基本的特性之一。

该表达式str = "test"被转换为一个函数调用str.operator= ("test"),并且该表达式str == "test"将被转换为str.operator== ("test"), 或operator==(str,"test"),无论哪个有效。

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

编辑:哈,std::string不能转换为bool所以if条件仍然是错误的。我认为这是为问题制作一个很好的片段的人工制品。

于 2013-02-25T09:40:42.180 回答
2
if(str="test")  //it's an assignment not a comparison.

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

 why no compile errors?

因为它是 c++ 而不是 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' 
于 2013-02-25T09:39:33.647 回答
0

如果你这样做

if(str="test"){}

您将“测试”分配给str. 由于这是一个有效的操作,赋值将返回&str对您的对象的引用,因此您的 if 条件将始终得到满足。当然,如果str == 0那样的话就会报错。所以最好这样做:

if(str == "test"){}

感谢詹姆斯坎泽!

于 2013-02-25T09:41:14.080 回答
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 */ }
于 2013-02-25T09:52:01.677 回答