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?