为什么三个operator <

#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 !!!
}

第一个带有两个参数的operator <
有人可以再跟我解释一下吗?

更多信息:
cout << "Hello" << 'w' << endl;将被解释为...
operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow

最佳答案

您正在强制转换为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
char没有重载,因此将隐式转换为int,并且数值119出现在输出中。

根据上述std::ostream::operator<<()成员函数的链接引用:

c&#43;&#43; - c&#43;&#43;运算符&lt;&lt;(char),但以六进制/整数表示-LMLPHP
正如您在评论中提到的
std::cout << 'w' << 'w' << 'w' << std::endl;

将被推导为全局 std::ostream& operator<<(std:: ostream&, T) 重载的链接调用:
operator<<(operator<<(operator<<(operator<<(std::cout,'w'),'w'),'w'),std::endl);

09-04 07:33
查看更多