簡體   English   中英

在基於范圍的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";
  }
}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM