【发布时间】:2012-12-13 20:03:25
【问题描述】:
decltype(*it) 是迭代器的值类型,还是对它的左值引用,还是别的什么?
我认为它是一个左值引用,因为*it 是一个左值,但我不确定。
注意:在我的例子中,it 是一个BidirectionalIterator,但请随意回答一般情况。
【问题讨论】:
标签: c++ c++11 iterator type-inference decltype
decltype(*it) 是迭代器的值类型,还是对它的左值引用,还是别的什么?
我认为它是一个左值引用,因为*it 是一个左值,但我不确定。
注意:在我的例子中,it 是一个BidirectionalIterator,但请随意回答一般情况。
【问题讨论】:
标签: c++ c++11 iterator type-inference decltype
*it 不一定是左值。只有前向迭代器有这个要求。
迭代器(第 24.2.2 节)必须让 *it 成为返回 iterator_traits<Iterator>::reference(和其他不相关的东西)的有效表达式。对此没有任何其他说明,reference 不必是引用类型†。
输入迭代器(第 24.2.3 节)必须具有 *it 是返回 something 可转换为值类型的有效表达式。
然而,前向迭代器有以下要求(§24.2.5 第 1 段):
——如果
X是一个可变迭代器,reference是对T的引用;如果X是一个常量迭代器,reference是对const T的引用,
(这里T是迭代器的值类型)
这要求 *it 是一个引用,这意味着它必须是一个泛左值(即不能是纯右值,但可以是一个 xvalue,就像移动迭代器的情况一样)。
更高的迭代器类别不添加任何相关要求。
† reference 被定义为 *it 的类型,这使它有点循环定义,但没有任何限制。
【讨论】:
*it 不是引用的迭代器)都是既定做法,双向或随机访问迭代器。例如,std::vector<bool>::iterator 必须是随机访问迭代器,但它的“引用”类型不是引用(它是提供对特定位访问的代理)。
*it 肯定不能保证是左值。输入迭代器可能会返回一个右值。
【讨论】: