为什么*_iterator在删除std :: iterator后仍然需要typedef无效?

陳 力*_*陳 力 5 c++ iterator c++17

我使用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>
Run Code Online (Sandbox Code Playgroud)

要求我们确定std :: iterator的每个参数类型,因此,对于std::ostreambuf_iterator,void并不是那么糟糕.

我们知道, 在c ++ 17中不推荐使用std :: iterator.因此,迭代器应该在自己的主体中键入它们的成员类型,例如:

Member type           Definition
---------------------------------------------
value_type                  void
difference_type          void
pointer                        void
reference                     void
iterator_category       std::output_iterator_tag
Run Code Online (Sandbox Code Playgroud)

题:

为什么这些void类型仍然是typedefed?我想,我想

Member type           Definition
---------------------------------------------
iterator_category       std::output_iterator_tag
Run Code Online (Sandbox Code Playgroud)

足够.毕竟,弃用的动机std::iterator只是为了简化标准(库).所以应该有一些我无法弄清楚的原因.

谷歌搜索后,我发现了一个关于堆栈溢出的问题,答案说:

另一方面,将其定义为空白可以防止错误,例如:

typename Iter::value_type v = *it; //useless with an output iterator if it compiled
Run Code Online (Sandbox Code Playgroud)

但我想如果我们不输入typedef value_type,也可以防止这样的错误.

Fra*_*kHB 5

因为ISO C++ 17一般std::iteartor_traits需要所有这5种成员类型,即使它自C++ 17以来已经是SFINAE友好的.如果嵌套类型不足,则实例std::iterator_traits将没有所需的成员.目前,目前的草案没有改变.

另请参阅iterator_traits SFINAE友好性,了解原始提案的基本原理.