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

C++: Is it safe to delete post-increment operator on custom iterators?

本文关键字:运算符 是否 安全 删除 自定义 迭代器 C++      更新时间:2023-10-16

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

我想知道disallow在自定义前向迭代器(即)上执行此操作是否安全

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

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

引用官方C++11标准中关于这一问题的话将是最有用的,但诸如"大多数实现都是这样做和那样做"之类的回答也很受欢迎。

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

所以,不。如果你正在实现一个新的迭代器类型,那么该类型的实例必须是前增量和后增量的,并且所有STL算法和任何其他使用迭代器的函数都可能具有后增量性。

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

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