【问题标题】:Why do *_iterators still require typedef something void after removing std::iterator?为什么 *_iterators 在删除 std::iterator 后仍然需要 typedef 一些 void 的东西?
【发布时间】:2018-11-07 09:37:00
【问题描述】:

我使用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_iteratorvoid 还不错。

众所周知,std::iterator 在 c++17 中已弃用。因此,迭代器应该在自己的主体中定义其成员类型,例如:

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

问题:

为什么还要对这些 void 类型进行类型定义? IOW,我认为

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

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

google了一下,发现a question about 栈溢出,答案是:

另一方面,将其定义为 void 可以防止以下错误:

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

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

【问题讨论】:

  • 我会说它与 std::iterator_traits 相关(自 C++17 起对 SFINAE 友好)
  • T*ContiguousIterator,但没有成员 value_type。当你想处理所有迭代器时,你应该使用typename std::iterator_traits&lt;Iter&gt;::value_type而不是typename Iter::value_type

标签: c++ iterator c++17


【解决方案1】:

因为 ISO C++17 std::iteartor_traits 通常需要所有这 5 种成员类型,即使自 C++17 以来它已经对 SFINAE 友好。如果嵌套类型不足,std::iterator_traits 的实例将没有所需的成员。目前,这没有改变in the current draft

有关原始提案的基本原理,另请参阅 iterator_traits SFINAE friendliness

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2019-05-16
    • 2015-08-15
    • 2019-02-05
    相关资源
    最近更新 更多