В использовании-объявлении, могут ли зависимые имена отображаться в конструкторах после замены шаблона?

В этом примере:

template<class T>
struct S : T
{
    using T::X;
};

T::X это зависимое имя, которое относится к члену X в T, Если S<T> создается с T = X:

struct X
{
    X(int) {}
};
...
S<X> s(42);

Будет ли использование-объявление стать наследующим конструктором?

Clang отклоняет код DEMO, в то время как g++ принимает его.

Обратите внимание, что если мы напишем:

using T::X::X;

Оба компилятора принимают код и обрабатывают его как наследующий конструктор. Является using T::X позволили стать наследником-конструктором по стандарту?

1 ответ

Решение

Спасибо TC за указание на это:

Ключевой вопрос 2070, который находится на стадии разработки (подтверждено, что он является проблемой, и над редакцией решения ведется работа), рассматривает этот случай. Предлагаемое исправление требует, чтобы оба идентификатора были одинаковыми, чтобы этот код был принят в качестве наследующего конструктора.

В этом свете сообщение об ошибке от clang имеет смысл, так как T::X будет типом X, что вызывает ошибку "тип из шаблона без тега typename".

Исходное сообщение:

Таким образом, мне кажется, что реальный вопрос заключается в следующем: "Допустимо ли, что создание экземпляра шаблона изменяет семантическое значение оператора using?"

И ответ таков: это не запрещено. Я не знаю, было ли это взаимодействие предусмотрено и предусмотрено авторами стандарта. Но, насколько я могу судить, ссылаясь как на объявление использования в Разделе 10, так и на инициализацию шаблона в Разделе 17 буквой стандарта, да, using T::X разрешено, и да, объявление using станет наследующим конструктором, когда T является X.

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