迭代器的运算符 * return 可以按值吗?
May iterator's operator * return by-value?
所以,我想了解是否允许 const_iterator(即不可变)按值 return。
我发现 return 类型的 *r
应该是 reference
(1),其中 reference
是 iterator_traits<X>::reference
(2)。命名明显表明它通常应该是引用类型,但它必须吗?
不同的迭代器类别在这方面有什么区别吗?
我所有的标准链接(见下文)都是 n3242(我相信是最后的 c++11 草案),但我也很想知道 c++ 版本之间的区别,如果有的话。
(1) 24.2.2.2
(2) 24.2.1.11
前向和更强的迭代器应该 reference
是一个实际的引用类型 ([forward.iterators]/p1):
A class or pointer type X
satisfies the requirements of a forward
iterator if
- [...]
- if
X
is a mutable iterator, reference
is a reference to T
; if X
is a const iterator, reference
is a reference to const T
,
- [...]
输入迭代器可以有非引用 reference
。 istreambuf_iterator<charT>::reference
,例如charT
.
标准是 contradictory 关于 reference
可以用于输出迭代器的内容。引用链接的 LWG 问题,它 "can and can't be void
".
请注意,标准本身存在:从 N4140 开始,vector<bool>::iterator
应该是随机访问迭代器,但甚至不满足前向迭代器要求,因为它的 reference
需要是包装器 class 而不是实际的引用类型。* 另一个 current proposal 包含更多谎言(参见 bounds_iterator
)。
* 通过 N4284 应用的编辑,[vector.overview] 不再对 vector<bool>::iterator
提出任何要求超出 table 96 中的那些 - 这需要前向迭代器或更强的迭代器,因此标准仍然存在。
语言规范中没有明确规定运算符 * 应该 return 任何特别的东西。
显然,如果像往常一样将运算符 * 用作取消引用运算符,return 引用是一个很好的做法。
Boost xpressive 是一个广泛采用且备受推崇的模板库示例,它使用运算符 * 来 return 表示零次或多次匹配多个相似项的操作的对象。
此处的文档:
http://www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html
所以,我想了解是否允许 const_iterator(即不可变)按值 return。
我发现 return 类型的 *r
应该是 reference
(1),其中 reference
是 iterator_traits<X>::reference
(2)。命名明显表明它通常应该是引用类型,但它必须吗?
不同的迭代器类别在这方面有什么区别吗?
我所有的标准链接(见下文)都是 n3242(我相信是最后的 c++11 草案),但我也很想知道 c++ 版本之间的区别,如果有的话。
(1) 24.2.2.2
(2) 24.2.1.11
前向和更强的迭代器应该 reference
是一个实际的引用类型 ([forward.iterators]/p1):
A class or pointer type
X
satisfies the requirements of a forward iterator if
- [...]
- if
X
is a mutable iterator,reference
is a reference toT
; ifX
is a const iterator,reference
is a reference toconst T
,- [...]
输入迭代器可以有非引用 reference
。 istreambuf_iterator<charT>::reference
,例如charT
.
标准是 contradictory 关于 reference
可以用于输出迭代器的内容。引用链接的 LWG 问题,它 "can and can't be void
".
请注意,标准本身存在:从 N4140 开始,vector<bool>::iterator
应该是随机访问迭代器,但甚至不满足前向迭代器要求,因为它的 reference
需要是包装器 class 而不是实际的引用类型。* 另一个 current proposal 包含更多谎言(参见 bounds_iterator
)。
* 通过 N4284 应用的编辑,[vector.overview] 不再对 vector<bool>::iterator
提出任何要求超出 table 96 中的那些 - 这需要前向迭代器或更强的迭代器,因此标准仍然存在。
语言规范中没有明确规定运算符 * 应该 return 任何特别的东西。
显然,如果像往常一样将运算符 * 用作取消引用运算符,return 引用是一个很好的做法。
Boost xpressive 是一个广泛采用且备受推崇的模板库示例,它使用运算符 * 来 return 表示零次或多次匹配多个相似项的操作的对象。
此处的文档:
http://www.boost.org/doc/libs/1_57_0/doc/html/xpressive.html