Может ли класс и структура использоваться взаимозаменяемо в специализации шаблона? - PullRequest
1 голос
/ 02 мая 2019

Можно ли использовать ключевое слово struct, чтобы специализировать класс шаблона, объявленный с ключевым словом class? Минимальный, полный, проверяемый пример:

template <class T>
class X {};

template <>
struct X<int> {};  // explicit specialization (full specialization)

template <class T>
struct X<X<T>> {}; // partial specialization

Этот код компилируется на GCC 8.3 и Clang 8.0 .

Какое отношение к этому имеет стандарт? Цитата из стандарта с объяснением приветствуется.

1 Ответ

2 голосов
/ 02 мая 2019

Это допустимо.

[temp.class] / 4:

При переопределении, частичной специализации, явной специализации или явном создании экземпляра шаблона класса, ключ-класс согласуется в натуре с исходным объявлением шаблона класса ([dcl.type.elab]).

[dcl.type.elab] / 3 определяет "согласиться в натуре"":

Ключевое слово class-key или enum, присутствующее в подробный спецификатор типа , должно согласовываться в натуре с объявлением, которому имя вссылка подробный спецификатор типа .[...] Таким образом, в любом подробном спецификаторе типа ключевое слово enum должно использоваться для ссылки на перечисление ([dcl.enum]), класс union -key должен использоваться для ссылки на объединение ([класс]), а либо class или struct ключ-класс должен использоваться для ссылки на класс ([класс]) объявлено с использованием class или struct ключ-класс .

...