用于基元类型的基于范围的
range based for used for primitive type
正如在这个问题中看到的,OP试图使以下语句在数字上迭代。
for (int n : 10)
cout << n << endl;
显然,语法错误,因为int
没有begin()
和end()
方法。但这应该是可能的。基于循环的范围的文档,这一点很重要。
for
(
range_declaration:
range _expression)
loop_statementrange_expression-表示合适序列的任何表达式(定义了开始和结束成员函数或自由函数的数组或对象,请参见下文)或支撑的init列表。
以及以下
上述语法生成的代码等效于以下内容(
__range
、__begin
和__end
仅用于说明):{ // until C++17 auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } }
对begin_expr和end_expr进行了澄清:
begin_expr和end_expr定义如下:
- 如果range_expression是数组类型的表达式,则[…]
- 如果range_expression是类类型C[…]的表达式
- 否则,begin_expr是
begin(__range)
,end_expr则是end(__range)
,它们是通过参数相关查找找到的(不执行非ADL查找)
在我们的例子中,range_expression是10
,它既不是数组类型,也不是类类型,所以最后一个项目符号应该生效。所以我们提供这些功能
auto begin(int) {
return boost::counting_iterator<int>(0);
}
auto end(int n) {
return boost::counting_iterator<int>(n);
}
(boost::counting_iterator
可以很容易地实现)。它应该起作用,对吧?但是失败了
main.cpp: In function 'int main()':
main.cpp:17:18: error: 'begin' was not declared in this scope
for (int t : 10)
^~
main.cpp:17:18: note: suggested alternatives:
main.cpp:5:6: note: 'begin'
auto begin(int) {
^~~~~
In file included from /usr/local/include/c++/7.2.0/vector:66:0,
from main.cpp:1:
/usr/local/include/c++/7.2.0/bits/range_access.h:105:37: note: 'std::begin'
template<typename _Tp> const _Tp* begin(const valarray<_Tp>&);
^~~~~
(对于end
也是相同的消息)。然而,如果我根据描述更改循环的范围,我会得到以下内容,这是有效的。
{
auto && __range = 10;
for (auto __begin = begin(__range), __end = end(__range); __begin != __end; ++__begin) {
int t = *__begin;
std::cout << t << std::endl;
}
}
演示
关键短语是:
通过参数相关查找找到(不执行非ADL查找)
int
没有命名空间。不,甚至连全局命名空间都没有。因此,基于名称空间的查找什么也找不到。
更具体地说,【basic.lookup.argdep】/2.1说:
如果T是一个基本类型,则其关联的命名空间和类集都是空的。
由于没有关联的命名空间或类,ADL不起作用。
通过返回计数范围的用户定义文字可以更好地处理此问题。因此,您可以键入10_rng
,这将产生一个计数范围。
相关文章:
- 为什么我的变量存在于其范围之外
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 代码具有特定于函数的变量,用于更改范围之外的值
- 将自适应阈值应用于范围函数 opencv c++
- 为什么我将矢量下标出范围超出范围
- C++:将参数应用于函数范围
- C++11:用容器参数定义函数(类似于基于范围的)
- 在C /STL中,是否有相当于Python范围()的紧凑型
- 如何制作增强多指数复合范围语句,等效于x和y
- std::copy_n 是否适用于重叠范围?
- 依赖于模板参数的范围查找
- 在现代C++中,有没有类似于python中基于范围的“enumerate”循环
- 如何让代码存在于两个或多个非嵌套命名空间的范围内
- 如何使用范围 v3 范围实现平面地图
- 应用于单词数组的随机数范围
- 标准算法 any_of()、all_of() 和 none_of() 应用于空范围
- 常数,但仅适用于此范围的剩余部分
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 存储一组不重叠的范围,并严格查找一个值是否存在于任何一个范围中
- 'make_error_code' 未在此范围内声明,并且在实例化点通过依赖于参数的查找未找到任何声明