Подтвердить что ты не робот

В использовании-декларации могут ли зависимые имена визуализировать конструкторы после замены шаблона?

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

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

4b9b3361

Ответ 1

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

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

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

Оригинальное сообщение:

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

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