Я узнал о инициализаторе с зависящими от фигурной скобки в языке программирования С++, 4-е изд. > Глава 2: Обзор С++: Основы.
Я цитирую приведенную ниже книгу.
Форма = традиционная и относится к C, но если есть сомнения, используйте общую форму {} -list (§6.3.5.2). Если ничего больше, это избавит вас от конверсий, которые теряют информацию (сужение конверсий, §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)
Однако я не могу воспроизвести эти результаты.
У меня есть следующий код.
#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";
}
Когда я компилирую и запускаю его, я не получаю никаких ошибок. Я получаю предупреждение о std=c++11
, но без ошибок.
$ 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
Кроме того, предупреждение предназначено только для второго задания, но для третьего назначения нет предупреждения. Это, по-видимому, указывает на то, что =
не является излишним, как указано в книге. Если =
были избыточными, либо второе, либо третье присваивания выдавали предупреждения или оба не выдавали бы предупреждения.
Затем я скомпилирую их с флагом -std=c++11
.
$ 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
По-прежнему нет ошибок. Только предупреждения. Хотя в этом случае второе и третье присваивания ведут себя одинаково в отношении генерирования предупреждений.
Итак, мой вопрос: хотя в книге упоминается, что второе и третье присваивания являются ошибками, почему этот код не скомпилирован?