[英]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";
}
}
GCC 4.8.1告訴:
prog.cpp:10:17: error: redeclaration of ‘std::string i’
std::string i = "oups";
^
它是MSVC 2013編譯器中的一些錯誤嗎?
是的,這是一個錯誤,但在海灣合作委員會。 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
沒有任何問題。
而且,正如這個實例所示,當這樣拼寫時,GCC實際上接受它就好了。
這是GCC中的一個錯誤,還有Clang
請參閱基於范圍的For循環
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.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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.