2016-06-26 43 views
11

Per esempio, ho definito un array multidimensionaleÈ per (auto & a: a) grammaticalmente corretto?

array<array<array<int, 3>, 4>, 5> a; 

E io loop

for (auto& a : a) 
    for (auto& a : a) 
     for (auto& a : a) 
      a = 1; 

È quello giusto nella grammatica? Ho provato in VS2015. Nessun errore di compilazione.

+0

@Resurrection: Esso non viene compilato perché non c'è non corrispondente '<' and '>' nella dichiarazione di 'a'. Dopo averlo corretto, dovrebbe essere compilato perché è legale (ad esempio, clang lo accetta). –

+0

@BenVoigt L'ho notato e corretto, ma ancora non si compila in VS2015 con errore di ridefinizione. EDIT: Ok, non importa, ho avuto un'altra variabile denominata 'a' lì. Beh, questo era confuso! – Resurrection

risposta

18

È legale e farà ciò che ci si aspetta, ma è ancora una pessima idea riutilizzare i nomi delle variabili.

Il C++ 11 ranged-for è definito come una trasformazione di origine, che inserisce la definizione della variabile di intervallo in un ambito interno ed esegue la valutazione dell'espressione di intervallo al di fuori di tale ambito.

sezione 6.5.4 dice che

La gamma-based per la dichiarazione

for (for-range-declaration : for-range-initializer) statement 

è equivalente a

{ 
    auto &&__range = for-range-initializer ; 
    auto __begin = begin-expr ; 
    auto __end = end-expr ; 
    for (; __begin != __end; ++__begin) { 
     for-range-declaration = *__begin; 
     statement 
    } 
} 
+0

Quindi ho bisogno di più nomi temporanei, anche non leggibili. Qualche modo migliore? – user1899020

+0

Sarebbe leggibile se scegliessi dei bei nomi. Non è colpa mia se sei troppo pigro per digitare nomi di variabili multicharacter. –

+0

Sono * completamente * equivalenti? Sono autorizzato a modificare quelle variabili interne? – HolyBlackCat

6

Sì, è :)

Il motivo è perché il a si dichiara nel ciclo for nasconde la matrice originale a:

for (auto& a : a) 
      ^^^ ^^^^^^^^^ 
      hides this 'a' (the original array) 

E poi, è solo lo stesso tutto da capo .