关于ostream类和运算符的误解<<

Rou*_*uki 10 c++ iostream

看完ostream::operator <<c ++参考后,

我注意到以下声明:

ostream& operator<< (bool val);
ostream& operator<< (short val);
ostream& operator<< (unsigned short val);
ostream& operator<< (int val);
ostream& operator<< (unsigned int val);
ostream& operator<< (long val);
ostream& operator<< (unsigned long val);
ostream& operator<< (float val);
ostream& operator<< (double val);
ostream& operator<< (long double val);
ostream& operator<< (void* val);
ostream& operator<< (streambuf* sb );
ostream& operator<< (ostream& (*pf)(ostream&));
ostream& operator<< (ios& (*pf)(ios&));
ostream& operator<< (ios_base& (*pf)(ios_base&));
Run Code Online (Sandbox Code Playgroud)

但后来我发现还有以下声明:

ostream& operator<< (ostream& os, char c);
ostream& operator<< (ostream& os, signed char c);
ostream& operator<< (ostream& os, unsigned char c);
ostream& operator<< (ostream& os, const char* s);
ostream& operator<< (ostream& os, const signed char* s);
ostream& operator<< (ostream& os, const unsigned char* s);
Run Code Online (Sandbox Code Playgroud)

为什么char/string输出运算符不是成员函数?

Bo *_*son 5

第一组运算符是流类的成员.

大多数操作员重载,如第二组中的那些,都不是.


至于原因,这可能只是一次历史性事故.内置类型的运算符可以添加到流类中,显然它们是(在C++标准化之前很久).该标准只是记录了现有的做法.

用户定义类型的运算符显然无法添加到流类中,因此它们实现为自由函数.

回想起来,让所有运营商免费使用功能会更加一致,但这可能会破坏一些旧的程序.