在基于范围的for循环中重新声明变量
Redeclaration of variable in range-based for loops
此代码在GCC 4.8.1中失败,但可以在MSVC2013中工作:
#include <vector>
#include <string>
int main()
{
std::vector<int> V{1,2,3,4,5};
for (auto i : V)
{
std::string i = "oups";
}
}
prog.cpp:10:17: error: redeclaration of ‘std::string i’
std::string i = "oups";
^
是MSVC 2013编译器中的一些错误吗?
是的,这是一个bug,但是在GCC中。c++ 11[支撑。range]清楚地说明基于range的for
循环相当于:
{
auto && __range = (V);
for ( auto __begin = __range.begin(),
__end = __range.end();
__begin != __end;
++__begin ) {
auto i = *__begin;
{
std::string i = "oups";
}
}
}
因此,内部i
应该简单地隐藏环控i
而不会出现任何问题。
这是GCC和Clang中的一个bug
参见Range Based For-loop
for ( range_declaration : range_expression ){ loop_statement }
等价于
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
{ // Notice brace
loop_statement
} // Notice ending brace
}
}
关于Visual c++ 2013
for (auto i : V) std::string i = "oups";
/* match this with equivalent for-loop
loop-statement aren't in braces
*/
不能编译。
c++11 [stmt. cn]range]告诉range-for循环展开成这样:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
与其他答案相反,我声称语句没有作用域,这是MSVC的错误(不是gcc或clang)。
相关文章:
- C++:继续创建新的变量可以吗
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- 有没有办法初始化不涉及编写构造函数的新结构变量?
- “auto”每次创建一个新的变量实例
- 在初始化中使用新声明的变量(int x=x+1)
- 新关键字"auto" ;什么时候应该使用它来声明变量类型?