fed*_*ino 4 c++ arrays for-loop range c++11
请考虑以下代码段:
#include <iostream>
int main() {
int s[6] {0, 1, 2, 3, 4, 5};
for ( auto && i: s ) {
std::cout << " " << i << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这在g ++和clang ++下编译和运行都很愉快.
它在许多帖子中被认为是理所当然的(例如这里和这里),但我不清楚编译器如何在for range没有迭代器的情况下正确地推断出数组的大小.
任何人都可以回答或添加引用的链接吗?
根据工作草案[ 6.5.4/1 ]:
基于范围的声明
Run Code Online (Sandbox Code Playgroud)for ( for-range-declaration : for-range-initializer ) statement相当于
Run Code Online (Sandbox Code Playgroud){ auto &&__range = for-range-initializer ; auto __begin = begin-expr ; auto __end = end-expr ; for ( ; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }哪里
[...]
begin-expr和end-expr确定如下:
- 如果for-range-initializer是数组类型R的表达式,则begin-expr和end-expr分别是__range和__range + __bound,其中__bound是数组绑定的.如果R是一个未知大小的数组或一个不完整类型的数组,则该程序是不正确的;
[...]
所以它主要起作用@VladFromMoscow在他的回答中已经提到过.