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
...
}
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
...
}
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.
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
@sehe: Fair point. –
@sehe: Dort .... :) –
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
VS13 akzeptiert dies, siehe [hier] (http://rextester.com/DTEHL66513) –
@JohnOdom: Das sieht wie Java aus. Sind Sie sicher, dass Sie die richtige Sprache verwenden? – user2357112
Ja Entschuldigung, dachte Java, xD –