В использовании-объявлении, могут ли зависимые имена отображаться в конструкторах после замены шаблона?
В этом примере:
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.