为什么std :: basic_ostream同时包含free和member运算符&lt; <! - ? - >

时间:2015-01-07 08:55:36

标签: c++

标题是我的问题。 basic_ostream具有两种类型的插入运算符。免费operator<<用于字符,成员operator<<用于非字符数据。

为什么需要将某些实现为自由函数而将其他函数实现为成员函数?

1 个答案:

答案 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 ),但是没有人会这样做。)