什么是BidirectionalIterator的decltype(* it)?

时间:2012-12-13 20:03:25

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

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

我认为这是一个左值参考,因为*it是一个左值,但我不确定。

注意:在我的情况下,it BidirectionalIterator ,但随时可以回答一般情况。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

迭代器(第24.2.2节)要求*it是一个返回iterator_traits<Iterator>::reference的有效表达式(以及其他不相关的东西)。没有其他说法,reference不一定是参考类型†。

输入迭代器(第24.2.3节)要求*it是一个有效的表达式,它返回某些可转换为值类型。

但是,前向迭代器具有以下要求(第24.2.5段第1段):

  

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

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

这需要*it作为引用,这意味着它必须是glvalue(即不能是prvalue,但可以是xvalue,就像移动迭代器的情况一样)。

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


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