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

Создание шаблона

Если у меня есть следующий код:

template <typename T = int>
struct mystruct {
  using doublestruct = mystruct<double>;
}

mystruct<>::doublestruct obj;

Является ли это экземпляром шаблона mystruct<int> вообще? Или создается только mystruct<double>?

4b9b3361

Ответ 1

Да, он должен будет создать экземпляр mystruct<int>, чтобы получить доступ к своим членам и определить значение doublestruct. Вы можете проверить это с помощью static_assert:

#include <type_traits>

template <typename T = int>
struct mystruct {
  static_assert(!std::is_same<T,int>::value, "");
  using doublestruct = mystruct<double>;
};

mystruct<>::doublestruct obj;     // assertion fails for T==int
mystruct<char>::doublestruct obj; // OK, not instantiated for int

Ответ 2

Да, он должен быть создан; doublestruct является членом экземпляра, поэтому, если у вас нет экземпляра, у вас нет doublestruct.

[C++11: 14.7.1]: Если спецификация шаблона класса явно не была создана (14.7.2) или явно специализирована (14.7.3), специализация шаблона класса неявно создается, когда специализация ссылается в контексте, который требует полностью определенного тип объекта или когда полнота типа класса влияет на семантику программы. [..]

В частности, рассмотрим потенциальный эффект специализаций mystruct, который может не содержать член doublestruct, или может содержать тот, который не является типом.