模板的实例化

时间:2015-04-17 11:05:40

标签: c++ templates

如果我有以下代码:

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

mystruct<>::doublestruct obj;

这是否会实例化mystruct<int>模板?或者仅mystruct<double>被实例化?

2 个答案:

答案 0 :(得分:18)

是的,它必须实例化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

答案 1 :(得分:16)

是的,必须实例化; doublestruct是实例化的成员,因此,如果您没有实例化,则没有doublestruct

  

[C++11: 14.7.1]:除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全需要完全上下文的特定化中引用特化时,将隐式实例化类模板特化。 - 定义的对象类型或类类型的完整性会影响程序的语义。 [..]

特别要考虑mystruct可能不包含成员doublestruct的专业化的潜在影响,或者可能包含非类型成员的专业化影响。