构造函数的名称和模板的析构函数

时间:2017-11-17 06:07:57

标签: c++ c++11 templates constructor

来自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被视为命名构造函数,“这不是模板

1 个答案:

答案 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 语法。

另一方面,析构函数永远不会成为模板。