是decltype(*it)
迭代器的值类型,还是对它的左值引用,还是别的什么?
我认为它是一个左值引用,因为它是一个左*it
值,但我不确定。
注意:在我的情况下,it
是BidirectionalIterator,但请随意回答一般情况。
是decltype(*it)
迭代器的值类型,还是对它的左值引用,还是别的什么?
我认为它是一个左值引用,因为它是一个左*it
值,但我不确定。
注意:在我的情况下,it
是BidirectionalIterator,但请随意回答一般情况。
*it
肯定不能保证是左值。输入迭代器可能返回一个右值。
*it
不一定是左值。只有前向迭代器有这个要求。
迭代器(第 24.2.2 节)必须*it
是一个有效的返回表达式iterator_traits<Iterator>::reference
(和其他不相关的东西)。对此没有任何其他说明,并且reference
不必是引用类型†。
输入迭代器(第 24.2.3 节)必须是返回可转换为值类型*it
的内容的有效表达式。
但是,前向迭代器具有以下要求(第 24.2.5 节第 1 段):
— if
X
是可变迭代器,是对;reference
的引用T
ifX
是 const 迭代器,reference
是对 的引用const T
,
(这里T
是迭代器的值类型)
这需要*it
是一个引用,这意味着它必须是一个glvalue(即不能是prvalue,但可以是一个xvalue,就像移动迭代器的情况一样)。
更高的迭代器类别不添加任何相关要求。
†reference
被定义为*it
使其有点循环定义的类型,但没有限制。