C++:在自定义迭代器上删除后增量运算符是否安全
C++: Is it safe to delete post-increment operator on custom iterators?
根据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通用算法(如copy
、sort
、fill
等)时,STL永远不会在这样的自定义迭代器it
上调用it++
。?
引用官方C++11标准中关于这一问题的话将是最有用的,但诸如"大多数实现都是这样做和那样做"之类的回答也很受欢迎。
所有迭代器都必须是可递增的前迭代器和可递增的后迭代器。这是输入迭代器和输出迭代器需求的一部分。参见C++11§24.2[迭代器要求]表107和108。引用这些表相当困难,但在这两个表中,表达式++r
和r++
必须对迭代器r
有效。
所以,不。如果你正在实现一个新的迭代器类型,那么该类型的实例必须是前增量和后增量的,并且所有STL算法和任何其他使用迭代器的函数都可能具有后增量性。
因为迭代器也必须是可复制构造的,所以根据预增量运算符来实现后增量运算符通常是微不足道的。例如,
MyIterator operator++(int)
{
MyIterator original(*this);
++*this;
return original;
}
相关文章:
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 复合赋值运算符是否不如 C++ 精确?
- 放置新运算符是否会禁用默认的新运算符?
- C++箭头运算符 (->) 是否在所有情况下都返回左值?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 在这里使用删除运算符是否正确,我很困惑
- lambda 的调用运算符是否需要具有链接?
- 复制构造函数和复制赋值运算符是否应具有相同的语句?
- "new"运算符是否总是调用构造函数?
- 检查运算符是否在C++中过载
- C++新运算符是否在下面使用 malloc()
- 地址运算符是否返回变量引用的对象的地址
- 链表的这个别名运算符是否会产生深度复制
- cv::P oint3f 赋值运算符是否执行"深度"复制?
- 三向比较运算符是否始终有效
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- std::string 的运算符<是否应该受到当前区域设置的影响?
- 关于解引用运算符是否在表达式中产生对象对值的定义不明确
- 运算符是否应该==或!=在这种情况下扔
- 检查 QTextStream::运算符>>是否失败