Наследование конструктора с псевдонимом типа в производном классе шаблона

Пожалуйста, смотрите следующий код:

struct base {};

template <class T>
struct derived : T {
  using base_type = T;
  using base_type::T;
};

int main()
{
  derived<base> x;
}

GCC принимает этот код, но Clang и MSVC отклоняют его. Кто прав и почему?

1 ответ

Решение

using base_type::T; является декларацией, а using прежде чем это псевдоним. Это немного крайний случай в стандарте, так как реальный вопрос сводится к тому, где T расширяться. На комитет C++ здесь ссылались как на то, что он не намеревался сделать этот синтаксис действительным, поэтому LLVM явно удалила его. Не похоже, что в стандарте есть что-то, что мешает этому, поэтому gcc не ошибается в разрешении конвертации. Кто "правильный", зависит от вас.

Другие вопросы по тегам