我尝试过的所有标准实现都允许将值分配给std::ostream_iterator
,而无需在分配之前取消对它们的引用。尽管标准算法在赋值之前取消引用迭代器,但我想知道为什么有些实现不静态地禁止赋值(在代理类的帮助下),这样编译就会失败,以便用户知道如果由于某些原因将这种分配移植到不允许该分配的另一个实现,则可能会发生错误。一般来说,在实现标准功能时,将实现限制为只允许标准中明确提到的内容是一种好的做法吗?
#include <iterator>
#include <string>
#include <iostream>
using namespace std;
int main() {
ostream_iterator<string> o(cout);
o = "Hello Worldn"; // o is not dereferenced! It compiles with my GCC environment
o++; // to make sure the implementation writes to cout
}
允许此赋值的运算符重载由C++语言标准指定。因此,C++标准库实现必须提供它
过载规定如下(来自C++11§24.6.2.2/1):
ostream_iterator& operator=(const T& value);
效果:
*out_stream << value; if(delim != 0) *out_stream << delim; return (*this);
(T
是用于实例化ostream_iterator
的T
。在您的示例中,它是string
。)
流迭代器实际上只是假的迭代器。插入发生在为ostream_iterator
赋值时,而提取发生在对istream_iterator
取消引用时。ostream_iterator
的operator*()
实际上被指定为仅返回*this
的无操作。