Вот мой код:
#include <vector>
int main()
{
std::vector<int> a = {1, 2.2};
}
Как и ожидалось, это не компилируется из-за недопустимого сужающего преобразования:
$ clang++ -std=c++11 foo.cpp
foo.cpp:5:30: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
std::vector<int> a = {1, 2.2};
^~~
Почему это компилируется только с предупреждением?
#include <complex>
int main()
{
std::complex<int> a = {1, 2.2};
}
Вот предупреждение:
$ clang++ -std=c++11 foo.cpp
foo.cpp:5:31: warning: implicit conversion from 'double' to 'std::__1::complex<int>::value_type' (aka 'int') changes value from 2.2 to 2 [-Wliteral-conversion]
std::complex<int> a = {1, 2.2};
~ ^~~
1 warning generated.
Я понимаю понятие диагностики и понимаю, что компилятор C++ должен выдавать диагностику только в виде ошибки или предупреждения.
Но я хочу быть уверен, что я не неправильно понимаю здесь какую-либо концепцию. В частности, я хочу знать, есть ли какая-либо концепция С++, которую мне нужно знать, почему в первом случае была выдана диагностика c++11-narrowing
, а во втором случае была выдана диагностика literal-conversion
.
std::complex
, принимающего список инициализаторов. . Таким образом, нет сужающих конверсий. См., например. этот справочник по инициализации списка для получения дополнительной информации. - person Some programmer dude   schedule 22.05.2018