为什么使用 X 而不是 X<T> 作为模板化构造函数和析构函数?

Why use X and not X<T> for templated constructor and destructor?

本文关键字:构造函数 析构函数 为什么 lt gt      更新时间:2023-10-16

在专业C++(2e,第689页(中,它说:

仅对于构造函数和析构函数,应该使用X,而不是CCD_ 2。

因此:

template<typename T>
class X{
    X();                                  // X
    ~X();                                 // X
    X<T>& operator=(const X<T>& rhs);     // X<T>
};

为什么不应该将X<T>用于构造函数和析构函数声明?

很简单,这句话是错误的

X<T>是类型的实际名称:

[C++11: 14.2/6]:命名类模板专用化的简单模板id类名(第9条(。

…你可以在任何地方使用它:

template<typename T>
class X
{
public:
    X<T>() {}
    ~X<T>() {}
    X<T>& operator=(const X<T>& rhs) {}
};
int main()
{
    X<int> x;
}

(现场演示(

您可以选择使用X作为"简写",从而自动为您添加模板参数(有点(:

[C++11: 14.6.1/1]:与普通(非模板(类一样,类模板有一个注入的类名(第9条(。注入的类名可以用作模板名类型名当它与模板参数列表一起使用时,作为模板的模板参数,或者作为友类模板声明的详细类型说明符中的最终标识符时,它指的是类模板本身否则,它等效于<>中包含的类模板的模板名称模版参数

…但在任何地方都不需要

听起来作者试图强制执行风格指南,但没有充分明确地表明这完全取决于您

这里与X无关,它只是一个类名。

由于构造函数和析构函数与类共享相同的名称,并且两者都没有返回类型,因此无需指定它