2014-02-10 8 views
5

in C++ 11 ist es möglich, die folgendeEntfernt für Schleife mit Literal-Liste?

int ns[] = { 1, 5, 6, 2, 9 }; 
for (int n : ns) { 
    ... 
} 

als so etwas wie dieses

for (int n : { 1, 5, 6, 2, 9 }) { // VC++11 rejects this form 
    ... 
} 
+0

VS13 akzeptiert dies, siehe [hier] (http://rextester.com/DTEHL66513) –

+0

@JohnOdom: Das sieht wie Java aus. Sind Sie sicher, dass Sie die richtige Sprache verwenden? – user2357112

+0

Ja Entschuldigung, dachte Java, xD –

Antwort

16

tl; dr: Compiler für großen Erfolg Erweitere .


Ja, es ist gültig.

Die Definition von ranged-in in [C++11: 6.5.4/1] gibt uns zwei Varianten der Syntax für dieses Konstrukt. Man nimmt einen Ausdruck auf der rechten Seite der :, und der andere nimmt eine braced-init-Liste.

Ihre verspannt-init-Liste folgert (durch auto) zu einem std::initializer_list, die, weil praktisch ist, diese Dinge über iteriert werden kann.

[..] für eine bereichsbasierte for Aussage der Form

for (für Strecken-Erklärung:verspannt-init-Liste) statement

lassen Bereich -init entspricht der braced-init-Liste. In jedem Fall ist eine bereichsbasierte für Aussage äquivalent zu

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

[..]

Also, sagen Sie grundsätzlich:

auto ns = { 1, 5, 6, 2, 9 }; 
for (int n : ns) { 
    // ... 
} 

(I haven Ich habe mich nicht mit der universellen Referenz beschäftigt.)

wiederum das ist mehr oder weniger gleichwertig:

std::initializer_list<int> ns = { 1, 5, 6, 2, 9 }; 
for (int n : ns) { 
    // ... 
} 

Nun GCC 4.8 supports this aber, da "Visual Studio 11" ist in der Tat von Visual Studio 2012, werden Sie in aktualisieren müssen Um aufzuholen: initialiser lists were not supported at all until Visual Studio 2013.

+0

Seit wann zitieren Sie einen Compiler in der Wildnis als autoritative Quelle? Ich meine, ich ** weiß ** es ist korrekt, aber ich erwarte ein Standard-Zitat/Link zu bestehenden Antwort von Ihnen :) – sehe

+0

@sehe: Fair point. –

+1

@sehe: Dort .... :) –

4

Es ist möglich, die Verwendung dieser Konstruktion mit einer Initialisiererliste zu schreiben. Es scheint einfach, das MS VC++, das Sie verwenden, unterstützt es nicht. Hier

ist ein Beispiel

#include <iostream> 
#include <initializer_list> 

int main() 
{ 
    for (int n : { 1, 5, 6, 2, 9 }) std::cout << n << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Sie müssen umfassen Header <initializer_list> weil die Initialisiererliste in der for-Anweisung zu std::initializer_list<int> umgewandelt wird

Verwandte Themen