Warum verursacht das Eingrenzen der Konvertierung, die mit dem durch geschweifte Klammern getrennten Initialisierer verwendet wird, keinen Fehler?

Ich habe in The C ++ Programming Language, 4. Auflage, etwas über den durch geschweifte Klammern getrennten Initialisierer gelernt. > Kapitel 2: Eine Tour durch C ++: Die Grundlagen.

Ich zitiere aus dem Buch unten.

ie Form @The = ist traditionell und geht auf C zurück. Verwenden Sie jedoch im Zweifelsfall die allgemeine {} -Listenform (§6.3.5.2). Wenn nichts anderes, erspart es Ihnen Konvertierungen, bei denen Informationen verloren gehen (Eingrenzung von Konvertierungen; §10.5):

int i1 = 7.2;    // i1 becomes 7
int i2 {7.2};    // error : floating-point to integer conversion
int i3 = {7.2};  // error : floating-point to integer conversion (the = is redundant)

Ich kann diese Ergebnisse jedoch nicht reproduzieren.

Ich habe den folgenden Code.

#include <iostream>

int main()
{
    int i1 = 7.2;
    int i2 {7.2};
    int i3 = {7.2};

    std::cout << i1 << "\n";
    std::cout << i2 << "\n";
    std::cout << i3 << "\n";
}

Wenn ich es kompiliere und ausführe, wird kein Fehler angezeigt. Ich bekomme eine Warnung überstd=c++11 aber kein Fehler.

$ g++ init.cpp 
init.cpp: In function ‘int main()’:
init.cpp:6:12: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     int i2 {7.2};
            ^
$ ./a.out 
7
7
7

Weiterhin gilt die Warnung nur für die zweite Zuweisung, aber für die dritte Zuweisung gibt es keine Warnung. Dies scheint darauf hinzudeuten, dass das= ist nicht wirklich redundant, wie im Buch erwähnt. Wenn=enn @ überflüssig wäre, hätten entweder die zweite und die dritte Zuweisung Warnungen erzeugt, oder beide hätten keine Warnungen erzeugt. Dann kompiliere ich sie mit dem-std=c++11 Flagge

$ g++ -std=c++11 init.cpp 
init.cpp: In function ‘int main()’:
init.cpp:6:16: warning: narrowing conversion of ‘7.2000000000000002e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
     int i2 {7.2};
                ^
init.cpp:7:18: warning: narrowing conversion of ‘7.2000000000000002e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
     int i3 = {7.2};
                  ^
$ ./a.out 
7
7
7

Noch kein Fehler. Nur Warnungen. In diesem Fall verhalten sich die zweite und dritte Zuweisung hinsichtlich der Erzeugung von Warnungen identisch.

So ist meine Frage: Obwohl das Buch erwähnt, dass die zweite und dritte Zuweisung Fehler sind, warum kann dieser Code nicht kompiliert werden?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage