typedef和using会导致模板实例化吗?

iBu*_*Bug 7 c++ templates template-instantiation

假设我有一个像这样定义的模板类

template <typename T>
class Temp{
    // irrelevant
};
Run Code Online (Sandbox Code Playgroud)

我可以隐式或显式实例化它:

Temp<int> ti;
template class Temp<char>;
Run Code Online (Sandbox Code Playgroud)

通过显式实例化,我的程序应该包含一个实例,即使我以后不使用它(假设它没有被编译器优化省略).

我的问题是,以下语句是否会导致类的实例化?

typedef Temp<short> TShort;
using TFloat = Temp<float>; // C++11
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

否。隐式实例化仅在需要完全定义的类型时才发生;而类型别名则不必。

当代码在需要完全定义的类型的上下文中引用模板时,或者当类型的完整性影响代码,并且尚未明确实例化此特定类型时,将发生隐式实例化。例如,在构造此类型的对象时,但在构造指向此类型的指针时不这样。

例如,以下代码需要完全定义的类型

Temp<char> tc;
new Temp<char>;
sizeof(Temp<char>);
Run Code Online (Sandbox Code Playgroud)

Temp<char>* ptc;
Run Code Online (Sandbox Code Playgroud)

没有。