Создание шаблона
Если у меня есть следующий код:
template <typename T = int>
struct mystruct {
using doublestruct = mystruct<double>;
}
mystruct<>::doublestruct obj;
Является ли это экземпляром шаблона mystruct<int>
вообще? Или создается только mystruct<double>
?
Ответы
Ответ 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
, или может содержать тот, который не является типом.