比较整数和字符串没有编译错误?

win*_*ght 4 c++ compiler-errors compiler-warnings

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

int a = 0;
cout << a < " "; //note the '<'
Run Code Online (Sandbox Code Playgroud)

但是,MSVC++编译器只发出警告

警告C4552:'<':运算符无效; 预期的操作员有副作用

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

相关的SO帖子就在这里.

小智 7

<<经营者具有比优先级高<,所以这被分析为

(cout << a) < " ";
Run Code Online (Sandbox Code Playgroud)

你不是真的在比较字符串和整数.相反,您将比较ostream::operator<<std::cout自身的返回值与字符串文字.,这是不合法的(在某种意义上,它具有未指明的结果,并且没有意义),clang警告:

warning: result of comparison against a string literal is unspecified
Run Code Online (Sandbox Code Playgroud)

它编译的原因是直到C++ 11,才std::ostream可以隐式转换为void *.此外,类型的字符串文字const char[2]衰减为类型的指针const char *.因此,<操作符现在需要两个指针,这是允许的,尽管未指定结果,因为两个指针不指向同一个对象.

  • @ H2CO3:不喜欢语法上没有意义的东西很棒,但你不能说它们是*非法*.实际上C++标准没有使用"非法"这个词,但是当有并且只有在需要一个符合要求的编译器来诊断时,我才会说某些东西是非法的.在C中,这是语法错误和约束违规; 我认为C++使用不同的术语. (2认同)
  • @ H2CO3:我的观点是,使用"非法"一词来指代编译器可能会或可能不会警告的内容是对该词的误用.也许"不正确"更接近你所表达的想法. (2认同)