当你例示一个特殊化的模版的时候,模版的参数被已经定义的用户名或者内置类型取代。为了说明这个问题,让我们来看看下面的模版元函数和它的参数,T:
void dynarray <T>::resize (int sz)
{
T t; // problematic if T is a built-in
type
if (sz > size())
insert(end(), sz - size(), t);
else
// ..
}
这个代码有一个隐错,如果T碰巧是内置类型,那么局部对象t将会有一个不确定的值,无论是否会出现这样的状况,T作为一个类,它有一个用户定义的默认的构造函数,这样就使得t在合适的时候被初始化。我们为了确定一致性就先不管t的真实类型,将resize()第一行改成下面这种形式。
T t = T();
如果T是内置类型,这样做就可以保证t被初始化为0。如果它是一个类,它默认的构造函数会初始化对象t。就性能方面来说,我们可以参考下面的语句。当T是一个类的时候,下面的t的声明在语意上和上面的例子是等价的:
T t = T(); //no extra
overhead compared
//to
the following declaration:
T t;
当T是内置类型的时候,它们就有区别。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。