Подтвердить что ты не робот

Название Инъекции и Конструкторы

Недавно, после обновления библиотеки Clang 5.x, я заметил ошибку в моем коде, который был скомпилирован ранее на Clang 4.x, GCC 5.x-6.x и MSVC 2015 и 2017.

#include <iostream>
#include <typeinfo>
#include <vector>

int main()
{
    using a = typename std::vector<int>::vector;
    std::cout << typeid(a).name() << std::endl;
    return 0;
}

Clang-5.x выдает следующее предупреждающее сообщение, а все остальные компиляторы молча компилируют вышеуказанный код:

a.cpp:7:42: warning: ISO C++ specifies that qualified reference to 'vector' is a
  constructor name rather than a type in this context, despite preceding
  'typename' keyword [-Winjected-class-name]
using a = typename std::vector<int>::vector;

Какой компилятор неисправен? Правильно ли я полагаю, что Clang5.x имеет здесь правильное поведение, а все другие компиляторы (и версии) неверны. Если да, то стоит ли отправлять отчеты об ошибках в MSVC и GCC?

4b9b3361

Ответ 1

Clang-5 очень правилен. На [class.qual]/2:

В поиске, в котором имена функций не игнорируются, и вложенное имя-спецификатор назначает класс C:

  • если имя, указанное после вложенного имени-спецификатора, при поиске на C, представляет собой имя введенного класса C
  • ...

вместо этого имя считается именем конструктора класса C.

Что касается другой части вопроса. Да, это определенно стоит представить отчеты об ошибках. Стандартное соответствие (или, по крайней мере, более диагностическое отношение к нему) должно поощряться ИМО.