代码之家  ›  专栏  ›  技术社区  ›  Chen Li

为什么在删除std::iterator之后,*\u迭代器仍然需要typedef something void?

  •  5
  • Chen Li  · 技术社区  · 6 年前

    我用 ostreambuf_iterator 具体如下:

    在c++17之前,

    template< class CharT, class Traits = std::char_traits<CharT> >
    class ostreambuf_iterator : public std::iterator<std::output_iterator_tag,
                                                     void, void, void, void>
    

    需要我们确定std::iterator的每个参数类型,因此 std::ostreambuf_iterator void 也没那么糟。

    我们知道, std::iterator 在c++17中已弃用。因此,迭代器应该在自己的主体中typedef其成员类型,例如:

    Member type           Definition
    ---------------------------------------------
    value_type                  void
    difference_type          void
    pointer                        void
    reference                     void
    iterator_category       std::output_iterator_tag
    

    为什么这些空类型仍然需要typedef?瞧,我想

    Member type           Definition
    ---------------------------------------------
    iterator_category       std::output_iterator_tag
    

    够了。毕竟,反对的动机 std::iterator 只是为了简化标准(库)。所以应该有一些我想不出来的原因。

    在谷歌搜索之后,我发现 a question about 在堆栈溢出时,答案是:

    typename Iter::value_type v = *it; //useless with an output iterator if it compiled
    

    但我想如果我们不 value_type ,这样的错误也可以避免。

    1 回复  |  直到 5 年前
        1
  •  5
  •   FrankHB    6 年前

    因为ISO C++17 std::iteartor_traits std::iterator_traits in the current draft .

    另请参见 iterator_traits SFINAE friendliness