此代码在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";
}
}
GCC 4.8.1告诉:
prog.cpp:10:17: error: redeclaration of ‘std::string i’
std::string i = "oups";
^
是MSVC 2013编译器中的一些错误吗?
答案 0 :(得分:4)
是的,这是一个错误,但在海湾合作委员会。 C ++ 11 [stmt.ranged]明确指出基于范围的for
循环等效于此:
{
auto && __range = (V);
for ( auto __begin = __range.begin(),
__end = __range.end();
__begin != __end;
++__begin ) {
auto i = *__begin;
{
std::string i = "oups";
}
}
}
因此内部i
应该只是隐藏循环控件i
而没有任何问题。
并且,正如live example所示,当这样拼写时,GCC实际上接受它就好了。
答案 1 :(得分:1)
它是GCC中的一个错误,以及Clang
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
*/
不应该编译。
答案 2 :(得分:0)
c ++ 11 [stmt.ranged]告诉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)。