【发布时间】:2014-01-29 00:50:16
【问题描述】:
考虑这段代码:
#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';
}
}
}
正如所料,GCC 4.8 compiles it just fine,输出为:
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
}
}
它确实说:
__range、__begin和__end是仅为说明定义的变量
但它没有明确说明每个 ranged-for 语句应该扩展为其中每个变量都是唯一的代码,因此不会在封闭的 ranged-for 中隐藏相同的变量。
为此,在我看来,嵌套的 ranged-for 语句不能保证按预期工作。
我们确定这不是缺陷吗?
【问题讨论】:
-
您是否建议内循环可能无法工作,因为可能存在相同的说明性变量名称?
-
嗯,这种感觉就像问一个非问题,然后自己回答来捞分……
-
@Sean:自我回答不是“钓鱼积分”。捐赠时间和精力来帮助其他人学习我所学到的东西。如果您认为这不是问题,欢迎您投反对票,但我鼓励您首先检查 language-lawyer 标记的用途。
-
我完全支持人们捐赠时间并分享他们所学到的东西。我只是惊讶于您的声誉得分,您认为您只是刚刚了解到这不是一个问题。毕竟,我们已经嵌套了
for、if和while语句有一段时间了! -
@Sean:具体来说,它是关于 ranged-
for的定义,以及该定义在标准中的呈现方式。和if和while一点关系都没有。
标签: c++ c++11 language-lawyer