4

可能像很多人一样,我输入了这个错字

int a = 0;
cout << a < " "; //note the '<'

但是,MSVC++ 编译器只抛出了一个警告

警告 C4552:“<”:运算符无效;具有副作用的预期运算符

虽然我预计会出现编译错误。它确实是标准的投诉代码吗?是否发生任何使代码有效的隐式类型转换或重载?我也很困惑<运算符是将字符串" "与整数a还是结果进行比较cout << a

一个相关的 SO 帖子在这里

4

3 回答 3

7

运算符的<<优先级高于<,因此将其解析为

(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 *。因此,<运算符现在采用两个指针,这是允许的,尽管其结果未指定,因为这两个指针不指向同一个对象。

于 2013-07-21T19:13:05.477 回答
3

实际上,既然是(cout << a) < " ",我们正在比较ostream" "。该类ostream有一个运算符将其转换为void *. 您可以比较 avoid *和 aconst char *而不进行强制转换,因此编译器很乐意这样做,然后意识到您没有使用比较的结果,并发出警告。

C ++中那些古怪的东西之一。

于 2013-07-21T19:53:59.120 回答
1

这取决于运算符优先级

IE

这条线等于(cout << a) < " ";- 因此<" "什么都不做!

编辑

该位返回一个对象,返回一个没有重载运算符(cout << a)的类型的对象,因此编译器要么放弃(C++11)要么抓挠它的头,并且在整数运算符处有一个bash(即指针等)。ostream<

于 2013-07-21T19:12:44.190 回答