可能像很多人一样,我输入了这个错字
int a = 0;
cout << a < " "; //note the '<'
但是,MSVC++ 编译器只抛出了一个警告
警告 C4552:“<”:运算符无效;具有副作用的预期运算符
虽然我预计会出现编译错误。它确实是标准的投诉代码吗?是否发生任何使代码有效的隐式类型转换或重载?我也很困惑<
运算符是将字符串" "
与整数a
还是结果进行比较cout << a
一个相关的 SO 帖子在这里。
可能像很多人一样,我输入了这个错字
int a = 0;
cout << a < " "; //note the '<'
但是,MSVC++ 编译器只抛出了一个警告
警告 C4552:“<”:运算符无效;具有副作用的预期运算符
虽然我预计会出现编译错误。它确实是标准的投诉代码吗?是否发生任何使代码有效的隐式类型转换或重载?我也很困惑<
运算符是将字符串" "
与整数a
还是结果进行比较cout << a
一个相关的 SO 帖子在这里。
运算符的<<
优先级高于<
,因此将其解析为
(cout << a) < " ";
您并没有真正将字符串与整数进行比较。相反,您将返回值ostream::operator<<
本身std::cout
与字符串文字进行比较。这也是不合法的(从某种意义上说,它具有未指定的结果,并且没有意义),clang
警告:
warning: result of comparison against a string literal is unspecified
它编译的原因是在 C++11 之前,std::ostream
可以隐式转换为void *
. 此外,类型的字符串文字const char[2]
衰减为类型的指针const char *
。因此,<
运算符现在采用两个指针,这是允许的,尽管其结果未指定,因为这两个指针不指向同一个对象。
实际上,既然是(cout << a) < " "
,我们正在比较ostream
与" "
。该类ostream
有一个运算符将其转换为void *
. 您可以比较 avoid *
和 aconst char *
而不进行强制转换,因此编译器很乐意这样做,然后意识到您没有使用比较的结果,并发出警告。
C ++中那些古怪的东西之一。
这取决于运算符优先级
IE
这条线等于(cout << a) < " ";
- 因此<" "
什么都不做!
编辑
该位返回一个对象,返回一个没有重载运算符(cout << a)
的类型的对象,因此编译器要么放弃(C++11)要么抓挠它的头,并且在整数运算符处有一个bash(即指针等)。ostream
<