嵌套的基于范围的语句是否严格合法?

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语句不能保证按预期工作.

我们确定这不是缺陷吗?

Lig*_*ica 9

是的,这是完全合法的.

尽管在代码方面给出了标准中几乎唯一的ranged-for的整个定义,但这并不是一个简单的扩展:这个结构被设计为使用所需操作的中间表示在编译器内扩展.

简而言之,使用术语"展示"意味着无论如何这都是有效的伪代码.

此外,如果仔细查看这些变量的范围,他们就无法与封闭的ranged-for语句中声明的指定用法相同的变量冲突,我们自己statement也无法访问它们.也就是说,没有任何隐藏这些循环变量可能导致意外行为的情况.

  • 这不是"只有博览会"的意思吗?:) (3认同)