为什么许多标准实现允许将值直接分配给ostream_iterator
Why do many standard implementations allow a value to be directly assigned to an ostream_iterator?
我尝试过的所有标准实现都允许将值分配给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
的无操作。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 需要从 istream 和 ostream 派生 iostream
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在 c++ 中将 ostream 分配给数据类型字符串
- 为什么不能重新分配给对 istream / ostream 的引用