Наследование конструктора с псевдонимом типа в производном классе шаблона
Пожалуйста, смотрите следующий код:
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 не ошибается в разрешении конвертации. Кто "правильный", зависит от вас.