双向迭代程序的decltype(*it)是什么

What is decltype(*it) for BidirectionalIterator?

本文关键字:it 是什么 decltype 迭代 程序      更新时间:2023-10-16

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

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

注意:在我的情况下,it双向迭代器,但可以随意回答一般情况。

*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的类型,这使得它有点像循环定义,但没有任何限制。

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