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

Явно создавать экземпляр класса через псевдоним шаблона

Можно ли явно создать экземпляр класса шаблона через псевдоним шаблона?

Если да, то как? В противном случае, может ли кто-нибудь указать на документ ISO, в котором это обсуждалось и принималось против?

template<class T>
struct A { };

/// Explicit instantiate A for int:
template struct A<int>;

/// Alias
template<class T>
using B = A<T>;

/// Explicitly instantiate A for double via alias B:
template struct B<double>;
/// error: elaborated type refers to a non-tag type

Должен ли этот экземпляр A<double>, так как B<T> является просто другим именем для A<T>?

4b9b3361

Ответ 1

Это косвенно запрещено, потому что:

7/3 запрещает записывать явную специализацию без ключа класса (class, struct или union):

В простом объявлении необязательный список init-declarator может быть опущен только при объявлении класса (раздел 9) или перечисления (7.2), то есть когда spec-specifier-seq содержит либо спецификатор класса, специфицированный тип-спецификатор с ключом класса (9.1) или спецификатором перечисления.

7.1.6.3/2 запрещает комбинировать ключ класса с специализацией шаблона псевдонима:

3.4.4 описывает, как поиск имен выполняется для идентификатора в специфицированном спецификаторе типа.... Если идентификатор разрешает имя typedef или идентификатор простого шаблона разрешает специализацию шаблона псевдонимов, специфицированный тип-спецификатор плохо сформирован.