【发布时间】: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_iterator,void 还不错。
众所周知,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<Iter>::value_type而不是typename Iter::value_type