【问题标题】:Apparent inconsistency in iterator requirements迭代器要求明显不一致
【发布时间】:2014-06-27 08:22:32
【问题描述】:

我正在实现一些类型特征/概念类,以检查传递给泛型函数的类型是否满足迭代器类型的编译时要求(如标准中所定义,从 24.2.2 开始)。

问题在于基本迭代器要求(表 106)是 *r 的类型(其中 r 是对 T 类型的迭代器的引用)是 std::iterator_traits<T>::reference。但是,如果我们考虑一个输出迭代器,例如std::ostream_iterator

http://en.cppreference.com/w/cpp/iterator/ostream_iterator

我们可以看到在这种情况下reference 类型是void,而迭代器类型的operator*() 返回std::ostream_iterator &

很明显,我在这里误解了一些东西,但我看不到什么?这与输出迭代器只能在赋值的左侧取消引用这一事实有关吗?

编辑:我想澄清一下,我的问题是关于引用类型与在 std::ostream_iterator 上调用 operator*()(以及标准库中的一堆其他输出迭代器)产生的类型之间的不一致。

【问题讨论】:

    标签: c++ c++11 iterator


    【解决方案1】:

    24.2.1 [iterator.requirements.general]/11

    在以下部分中,a 和 b 表示类型 X 或 const X 的值, 差异类型和参考是指类型 iterator_traits::difference_type 和 iterator_traits::reference 分别

    reference 不是allocator_traits<T>::reference,而是iterator_traits<T>::reference

    现在,在标准中std::ostream_iterator<T> 被定义为:

    class ostream_iterator:
                       public iterator<output_iterator_tag, void, void, void, void> {
    

    std::iterator 模板的最后一个参数是引用类型,这意味着对于std::ostream_iterator&lt;T&gt;iterator_traits&lt;T&gt;::reference 必须是void

    同时,24.2.1/1 要求:

    [...] 所有输出迭代器都支持表达式 *i = o 其中 o 是某个类型的值,该值位于可写入 i 的特定迭代器类型的类型集中。 [...]

    这可能是您缺少的部分,可确保分配有效。我想referencevoid 在某种程度上代表你无法阅读这个,但我想它可以改进。

    【讨论】:

    • 对于输出迭代器来说,*rnot 类型的 reference(不是 void),因此不满足此要求(如果是要求的话)。
    • 对,但令人困惑的部分是输出迭代器应该是迭代器概念的改进,其引用不能为空(因为它必须是 *r 的类型,根据通用迭代器要求)。编辑:@dyp 说什么。
    • @dyp:这两个要求存在矛盾。如果*i 的类型是void,则不能从适当的类型中分配,如果可以分配,则不能是void。也许是 DR... 可能需要 referencestd::ostream_iterator&lt;T&gt;&amp;...
    • @bluescarni:输入和输出迭代器是特殊的野兽。所有其他都是相关的,但不是这两个。要求可能是错误的,但假设 Input 和 Output 迭代器是 iterators 的方式与 Forward、Bidirectional、Random... 的方式相同...这会让你陷入困境 :)
    • @bluescarni:不,没有 OOP 类型的层次结构。例如,输入和输出迭代器都是单程迭代器。平等的定义,嗯,反对任何关于两个值应该相等的常识定义:a == b 并不意味着++a == ++b(这与值类型相反,如果你从两个值相同开始,并且您应用相同的操作,结果是这两个值具有相同的(即仍然比较==)。
    猜你喜欢
    • 2019-05-27
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多