什么是BidirectionalIterator的decltype(*it)?

fre*_*low 2 c++ iterator type-inference decltype c++11

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

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

注意:在我的情况下,itBidirectionalIterator,但随意回答一般情况.

Pup*_*ppy 5

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


R. *_*des 5

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

迭代器(第24.2.2节)必须*it是一个返回的有效表达式iterator_traits<Iterator>::reference(和其他不相关的东西).关于此没有其他说法,reference也不一定是参考类型†.

输入迭代器(第24.2.3节)必须*it是一个有效的表达式,它返回一个可转换为值类型的东西.

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

- 如果X是一个可变的迭代器,reference是一个引用T; if X是一个const迭代器,reference是一个引用const T,

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

这需要*it是一个引用,这意味着它必须是一个glvalue(即不能是一个prvalue,但可以像移动迭代器那样是一个xvalue).

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


reference被定义为*it使其具有圆形定义的类型,但不构成限制.