【问题标题】:What is decltype(*it) for BidirectionalIterator?BidirectionalIterator 的 decltype(*it) 是什么?
【发布时间】:2012-12-13 20:03:25
【问题描述】:

decltype(*it) 是迭代器的值类型,还是对它的左值引用,还是别的什么?

我认为它是一个左值引用,因为*it 是一个左值,但我不确定。

注意:在我的例子中,it 是一个BidirectionalIterator,但请随意回答一般情况。

【问题讨论】:

    标签: c++ c++11 iterator type-inference decltype


    【解决方案1】:

    *it 不一定是左值。只有前向迭代器有这个要求。

    迭代器(第 24.2.2 节)必须让 *it 成为返回 iterator_traits<Iterator>::reference(和其他不相关的东西)的有效表达式。对此没有任何其他说明,reference 不必是引用类型†。

    输入迭代器(第 24.2.3 节)必须具有 *it 是返回 something 可转换为值类型的有效表达式。

    然而,前向迭代器有以下要求(§24.2.5 第 1 段):

    ——如果X是一个可变迭代器,reference是对T的引用;如果X 是一个常量迭代器,reference 是对const T 的引用,

    (这里T是迭代器的值类型)

    这要求 *it 是一个引用,这意味着它必须是一个泛左值(即不能是纯右值,但可以是一个 xvalue,就像移动迭代器的情况一样)。

    更高的迭代器类别不添加任何相关要求。


    reference 被定义为 *it 的类型,这使它有点循环定义,但没有任何限制。

    【讨论】:

    • 请注意,无论规范怎么说,编写转发的代理迭代器(实际上,*it 不是引用的迭代器)都是既定做法,双向或随机访问迭代器。例如,std::vector<bool>::iterator 必须是随机访问迭代器,但它的“引用”类型不是引用(它是提供对特定位访问的代理)。
    • 是的,这实际上是我经常自愿忽略的规范的一部分,因为它过于严格。 ;)
    • 你们相处得很好。我们在 C++Now 2012 上讨论了这个问题,并且(大部分)有两组人:知道这条规则但认为它可以忽略的人,以及不知道这条规则的人感到惊讶,以及同意这是可以忽略的。 :-) [有一些关于完全重写迭代器要求的讨论,以更好、更清楚地表达可变和不可变范围,并减少对代理迭代器的限制。不过,我不知道这项工作的计划是什么,或者它是否会发生。]
    【解决方案2】:

    *it 肯定不能保证是左值。输入迭代器可能会返回一个右值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2013-11-30
      相关资源
      最近更新 更多