Lig*_*ica 1 c++ language-lawyer c++11
考虑以下代码:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v1 {1,2};
std::vector<int> v2 {4,5};
for (auto i : v1) {
for (auto j : v2) {
std::cout << i << ',' << j << '\n';
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,GCC 4.8编译得很好,输出是:
1,4
1,5
2,4
2,5
但是,C++ 11定义了ranged-for:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
Run Code Online (Sandbox Code Playgroud)
它确实说:
__range,,__begin和__end是仅为展示定义的变量
但是它没有说明每个ranged-for语句应该扩展到每个变量都是唯一的代码,因此不会在封闭的ranged-for中隐藏相同的变量.
为此,在我看来,嵌套的ranged-for语句不能保证按预期工作.
我们确定这不是缺陷吗?
是的,这是完全合法的.
尽管在代码方面给出了标准中几乎唯一的ranged-for的整个定义,但这并不是一个简单的扩展:这个结构被设计为使用所需操作的中间表示在编译器内扩展.
简而言之,使用术语"展示"意味着无论如何这都是有效的伪代码.
此外,如果仔细查看这些变量的范围,他们就无法与封闭的ranged-for语句中声明的指定用法相同的变量冲突,而我们自己statement也无法访问它们.也就是说,没有任何隐藏这些循环变量可能导致意外行为的情况.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |