7

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

template <typename T>
class Temp{
    // irrelevant
};

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

Temp<int> ti;
template class Temp<char>;

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

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

typedef Temp<short> TShort;
using TFloat = Temp<float>; // C++11
4

1 回答 1

5

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

当代码在上下文中引用需要完全定义类型的模板时,或者当类型的完整性影响到代码时,并且该特定类型没有被显式实例化时,就会发生隐式实例化。例如,当构造此类型的对象时,而不是构造指向此类型的指针时。

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

Temp<char> tc;
new Temp<char>;
sizeof(Temp<char>);

尽管

Temp<char>* ptc;

没有。

于 2017-10-05T03:23:19.207 回答