В этом примере:
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
позволили стать наследником-конструктором по стандарту?
Благодаря Т.С. для указания на это:
Основная проблема 2070, который находится на стадии разработки (подтверждено, что это проблема, и над формулировкой решения идет работа), имеет дело с этим делом. Предлагаемое исправление требует, чтобы оба идентификатора были одинаковыми, чтобы этот код был принят в качестве наследующего конструктора.
В этом свете, сообщение об ошибке от clang имеет смысл, поскольку T :: X будет типом X, который вызывает ошибку «тип из шаблона без тега typename».
Исходное сообщение:
Таким образом, мне кажется, что реальный вопрос заключается в следующем: «Допустимо ли, что создание экземпляра шаблона изменяет семантическое значение оператора using?»
И ответ таков: это не запрещено. Я не знаю, было ли это взаимодействие предусмотрено и предусмотрено авторами стандарта. Но, насколько я могу судить, ссылаясь как на объявление использования в Разделе 10, так и на инициализацию шаблона в Разделе 17 буквой стандарта, да, using T::X
разрешено, и да, объявление using станет наследующим конструктором, когда T является X.
Других решений пока нет …