Вот мой код:
#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 ++, в которой мне нужно знать, почему в первом случае была выдана диагностика c++11-narrowing
, а во втором - literal-conversion
диагностика.