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

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

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 позволили стать наследником-конструктором по стандарту?

18

Решение

Благодаря Т.С. для указания на это:

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

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

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

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]