2016-06-26 22 views
11

Zum Beispiel definiert ich ein mehrdimensionales ArrayIst für (auto & a: a) grammatikalisch richtig?

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

Und ich es Schleife

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

Ist das in der Grammatik richtig? Ich habe in VS2015 getestet. Keine Kompilierungsfehler.

+0

@Resurrection: Es lässt sich nicht kompilieren, weil es nicht übereinstimmend '<' and '>' in der Erklärung von 'a'. Nachdem das behoben wurde, sollte es kompiliert werden, da dies legal ist (zum Beispiel akzeptiert clang es). –

+0

@BenVoigt Ich habe es bemerkt und korrigiert, aber es kompiliert immer noch nicht in VS2015 mit Redefinition Fehler. EDIT: Ok, vergiss es, ich hatte eine andere Variable namens "a" dort. Nun, das war verwirrend! – Resurrection

Antwort

18

Es ist legal und wird tun, was Sie erwarten, aber es ist immer noch eine sehr schlechte Idee, Variablennamen wiederzuverwenden.

C++ 11 ranged-for ist als Quelltransformation definiert, die die Definition der Bereichsvariablen in einen inneren Bereich einfügt und eine Auswertung des Bereichsausdrucks außerhalb dieses Bereichs durchführt.

Abschnitt 6.5.4 sagt, dass

Der bereichsbasierte für Anweisung

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

äquivalent zu

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

Also brauche ich mehrere temporäre Namen, auch nicht lesbar. Irgendein besserer Weg? – user1899020

+0

Es wäre lesenswert, wenn Sie gute Namen wählen würden. Nicht meine Schuld, Sie sind zu faul, um mehrschreibende Variablennamen einzugeben. –

+0

Sind sie * vollständig * äquivalent? Darf ich diese internen Variablen ändern? – HolyBlackCat

6

Ja, es ist :)

Der Grund dafür ist, weil die a Sie in der for-Schleife deklarieren a das ursprüngliche Array versteckt:

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

Und dann, es ist nur die alle immer wieder gleiche .

Verwandte Themen