c ++ operator <<(char)但输出但是在hexa/int中

Thi*_*Thi 2 c++ operator-overloading ostream

为什么三个运算符<<输出不同的方式?

#include <iostream>
#include <string>

using namespace std;

int main()
{
  operator<<(cout, "Hello").operator<<('w').operator<<(endl); // Hello119

  cout << (void *)'w' << endl; // 0x77

  cout << 'w'; // w

  operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow !!!
}
Run Code Online (Sandbox Code Playgroud)

第一个带有2个参数的运算符<<按预期为字符串提供正确的输出,而其他参数则不...

有人可以向我解释一下吗?


更多信息:

cout << "Hello" << 'w' << endl; 会被解释为......

operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow

πάν*_*ῥεῖ 5

你正在强制转换为void指针并且有一个特化std::ostream& operator<<(std::ostream&,void*);,因此你得到输出为十六进制值而不是十进制.

注意:0x77 == 119

另请注意:

您在std::ostream::operator<<()此处调用成员运算符重载:

   operator<<(cout, "Hello").operator<<('w').operator<<(endl);
// ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
// |                         |
// |                         + Calls the std::ostream::operator<<() member operator
// + Calls the std::ostream& operator(std::ostream, T) global overload
Run Code Online (Sandbox Code Playgroud)

没有重载char,因此会进行隐式转换,int并且数值会119出现在输出中.

从上面的std::ostream::operator<<()成员函数的链接引用:

在此输入图像描述 正如你在评论中提到的

std::cout << 'w' << 'w' << 'w' << std::endl;    
Run Code Online (Sandbox Code Playgroud)

将被推断为全局std::ostream& operator<<(std:: ostream&, T)超载的链式调用:

operator<<(operator<<(operator<<(operator<<(std::cout,'w'),'w'),'w'),std::endl);    
Run Code Online (Sandbox Code Playgroud)

  • 好吧,但我认为值得添加到答案中,有接受int,short等的方法但接受`char`的函数不是成员. (2认同)
  • 我同意@Slava,这并不明显,因为`cout <<'w'`工作正常.我终于在你的链接上找到了它,在Notes下:"类型`char`和`const char*`的参数由operator <<的非成员重载处理." 解释可能更彻底. (2认同)