来自n4459:
635。构造函数的名称和模板的析构函数
定义a的语法之间存在差异 构造函数和类模板的析构函数。例如:
.mp3/.wav
原因是3.4.3.1 [class.qual]第2段说的那样 S :: S被“视为命名构造函数”,它不是模板,因此不能接受模板参数列表。 另一方面,
template <class> struct S { S(); ~S (); }; template <class T> S<T>::S<T>() { } // error template <class T> S<T>::~S<T>() { } // okay
中的第二个S找到了注入的类名,其中 “可以使用或不使用模板参数列表”(14.6.1 [temp.local]第1段)因此满足了名称的要求 析构函数的类(12.4 [class.dtor]第1段)。
我不明白,认为S::~S
被视为命名构造函数,“这不是模板?
答案 0 :(得分:6)
S :: S被“视为命名构造函数”,它不是模板,因此不能接受模板参数列表
是的,可能是因为构造函数可能被模板化。因此,通过阻止非模板构造函数不具有S<T>::S<T>
语法,该语言为模板化构造函数保留此语法。
以下是一个例子:
template <typename T>
struct X
{
template<typename U>
X();
~X ();
};
template <typename T>
template <typename U>
X<T>::X<U>() { } //OK now
template <class T>
X<T>::~X<T>() { } // okay
如果允许使用语法S<T>::S<T>()
,那么在这种情况下,您必须编写X<T>::X<T><U>()
- 这是一种丑陋的新语法。所以从某种意义上说,通过防止这种情况,语法更清晰,并且还避免引入 new 语法。
另一方面,析构函数永远不会成为模板。