本文介绍了在基于范围的表达式和声明中具有相同名称的标识符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在循环的expression语句中使用相同名称的基于范围的for循环中声明循环变量是否合法吗?我希望这个例子清楚。

Is it legal to declare a loop variable in a ranged-based for loop with the same name I use in the expression statement of the loop? I hope the example makes it clear.

#include <iostream>
#include <vector>

struct bar {
    std::vector<int> nums;
};

int main()
{
    bar b;
    b.nums = {1, 2, 3};

    for(int b : b.nums)
        std::cout << b << std::endl;   
}

gcc 4.8在clang 3.2允许的情况下出错。

gcc 4.8 gives an error while clang 3.2 allows it.

推荐答案

从我对C ++ 2011 6.5.4的阅读,你的代码:

From my reading of C++2011 6.5.4, your code of:

bar b;

for(int b : b.nums)
    std::cout << b << std::endl;

应转换为:

bar b;

{
   auto && __range = b.nums;
   for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin ) {
       int b = *__begin;
       std::cout << b << std::endl;
   }
}

这对我来说意味着 strong>是正确的。

This to me means that clang is correct.

这篇关于在基于范围的表达式和声明中具有相同名称的标识符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 11:16