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

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

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


person Jamboree    schedule 07.04.2017    source источник


Ответы (1)


Спасибо T.C. для указания на это:

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

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

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

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

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

person OmnipotentEntity    schedule 07.04.2017