【问题标题】:C++: Is it safe to delete post-increment operator on custom iterators?C++:删除自定义迭代器上的后增量运算符是否安全?
【发布时间】:2014-04-26 01:33:22
【问题描述】:

根据C++ reference,前向迭代器的要求是它支持后自增运算符(即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 永远不会在这样的自定义迭代器 it 上调用 it++,当它作为参数传递给 STL 通用算法(例如 copysortfill 等)时?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 另一方面,如果没有实现后增量,如果需要该运算符,编译器将给出错误。因此,虽然不应该将没有后增量的自定义迭代器称为“与 STL 兼容”,但它实际上可以与许多算法一起正常工作。 +1 建议如何在前增量方面实现后增量。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2011-11-30
    • 2021-10-21
    相关资源
    最近更新 更多