Почему разные диагностики с помощью clang по одному и тому же вопросу?

Вот мой код:

#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.


person Lone Learner    schedule 22.05.2018    source источник
comment
В отличие от векторного примера здесь нет конструктора std::complex, принимающего список инициализаторов. . Таким образом, нет сужающих конверсий. См., например. этот справочник по инициализации списка для получения дополнительной информации.   -  person Some programmer dude    schedule 22.05.2018


Ответы (1)


Происходят две разные вещи, которые, как вы можете видеть, приводят к разной диагностике:

  • В первом случае вы используете copy-list-initialization и находите конструктор std::vector, который принимает std::initializer_lsit.

  • Во втором случае вы используете copy-list-initialization для LiteralType, что приводит к агрегированной инициализации.

Они оба должны предотвращать сужение конверсий, но кажется, что clang реализует диагностику по-разному.

person Vittorio Romeo    schedule 22.05.2018