标题是我的问题。 basic_ostream具有两种类型的插入运算符。免费operator<<用于字符,成员operator<<用于非字符数据。
为什么需要将某些实现为自由函数而将其他函数实现为成员函数?
答案 0 :(得分:10)
它们可以全部作为免费功能实现,这是当今的首选用法。回到创建iostream时,他们可能一直试图将过载设置为小。
iostreams和locale库中有很多奇怪的东西;它们不应该被用作模型设计。
在C ++ 98中,你可以做到
int i;
std::ifstream( "data" ) >> i;
但你做不到
std::string s;
std::ifstream( "data" ) >> s;
临时ifstream
对象不会绑定到引用参数,但会绑定到this
。
这几乎是成员版和非成员版之间的唯一区别。 C ++ 11使用右值引用平滑了这个差异。 (还有你在没有运算符重载的情况下调用它们的方式,比如cin.operator >> ( i )
,但是没有人会这样做。)