Почему разные диагностики от Clang по аналогичной проблеме? - PullRequest
0 голосов
/ 22 мая 2018

Вот мой код:

#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 диагностика.

1 Ответ

0 голосов
/ 22 мая 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...