2

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

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

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

4

2 回答 2

5

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

于 2012-12-13T20:07:11.020 回答
5

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

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

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

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

— ifX是可变迭代器,是对;reference的引用 TifX是 const 迭代器,reference是对 的引用const T

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

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

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


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

于 2012-12-13T20:11:13.100 回答