C++:删除自定义迭代器上的后增量运算符是否安全?

标签 c++ c++11 iterator standards c++-standard-library

根据C++ reference ,前向迭代器的要求是它支持后增量运算符(即 iterator operator++(int)

我想知道在自定义前向迭代器上禁止此操作是否安全,即

custom_iterator operator++(int) = delete; // disallow post-increment, i.e. it++
custom_iterator operator++() { ... } // we only define pre-increment, i.e. ++it

并假设 STL 永远不会在这样的自定义迭代器 it 上调用 it++,当它作为参数传递给 STL 通用算法(例如 copy)时排序填充等?

有关此事的官方 C++11 标准的引述将是最有用的,但也欢迎诸如“大多数实现都这样做”之类的回答。

最佳答案

所有迭代器都必须是前置和后置递增的。这是输入和输出迭代器要求的一部分。请参阅 C++11 §24.2[iterator.requirements] 表 107 和 108。很难引用这些表,但在两个表中,表达式 ++rr++ 必须对迭代器 r 有效。

所以,不。如果您要实现一个新的迭代器类型,该类型的实例必须是可前增量和后增量的,并且所有 STL 算法和任何其他采用迭代器的函数都可以假定后增量。

因为迭代器也必须是可复制构造的,所以根据预增量运算符来实现后增量运算符通常是微不足道的。例如,

MyIterator operator++(int)
{
    MyIterator original(*this);
    ++*this;
    return original;
}

关于C++:删除自定义迭代器上的后增量运算符是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305547/

上一篇:C++ 冲突问题

下一篇:数组名称的 C++ 值

相关文章:

c++ - 实现我自己的 myless

C++进程调度问题

C++ 字符串输入作为 if/else 语句条件

c++ - 当正则表达式匹配重叠时会发生什么?

c++ - 需要帮助空运行,不知道输出是这样的

c++ - 为什么 C++ numeric_limits<enum_type>::max() == 0?

c++ - 多重映射迭代器不工作

c++ - 如何将 vector 中 pair 的第一个元素复制到另一个 vector ?

c++ - 霍夫曼解码太疯狂了

c++ - C++ 中全局数组初始化时的语法和缺少类型说明符错误