我写了一些这样的代码:
#include<string>
using namespace std;
int main() {
string str;
...
if(str=="test") //valid????
//do something
...
return 0;
}
稍后重新阅读代码后,我很好奇编译器是如何给出错误的? 注意:我已经检查了引用,看起来应该存在某种类型不匹配错误(将字符串对象与char数组进行比较)
编辑:抱歉= = = =错字。它已经修复了
编辑2:问题:
答案 0 :(得分:3)
正如其他人所提到的,单=
符号执行分配,而不是比较。
但是,operator overloading定义了比较运算符,就像赋值一样,是C ++最基本的功能之一。
表达式str = "test"
转换为函数调用str.operator= ("test")
,表达式str == "test"
将转换为str.operator== ("test")
或operator==(str,"test")
,无论哪一个的工作原理。
即使没有为std::string
和char *
的操作数定义重载函数,编译器仍会尝试查找函数以将参数转换为与此类函数匹配的类型
编辑:是的,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 */ }