gpt4 book ai didi

c++ - 为什么 *_iterators 在移除 std::iterator 后仍然需要 typedef something void?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:42 25 4
gpt4 key购买 nike

我使用 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 中已弃用。因此,迭代器应该在它们自己的主体中对它们的成员类型进行 typedef,例如:

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

问题:

为什么这些 void 类型仍然需要类型定义?哇,我想

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

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

谷歌搜索后,我找到了a question about 在堆栈溢出时,答案是:

Defining it as a void, on the other hand, can prevent errors like:

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

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

最佳答案

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

另见 iterator_traits SFINAE friendliness原始提案的基本原理。

关于c++ - 为什么 *_iterators 在移除 std::iterator 后仍然需要 typedef something void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com