decltype(*it)
是迭代器的值类型,还是对它的左值引用,还是别的什么?
我认为这是一个左值参考,因为*it
是一个左值,但我不确定。
注意:在我的情况下,it
是 BidirectionalIterator ,但随时可以回答一般情况。
答案 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
的类型,它使它成为一个循环定义,但没有任何限制。