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

msc*_*msc 1 c++ templates constructor c++11

n4459:

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

允许定义构造函数的语法和类模板的析构函数之间存在差异.例如:

template <class> struct S { S(); ~S (); };
template <class T> S<T>::S<T>() { }        // error
template <class T> S<T>::~S<T>() { }       // okay
Run Code Online (Sandbox Code Playgroud)

原因是3.4.3.1 [class.qual]第2段说 S :: S被认为是"命名构造函数",它不是模板,因此不能接受模板参数列表.另一方面,第二个S in S::~S找到inject-name-name,"可以使用或不使用template-argument-list"(14.6.1 [temp.local]第1段),从而满足要求命名析构函数的类(12.4 [class.dtor]第1段).

我不明白,是什么说S::S是"考虑到命名构造函数",这是不是一个模板

Naw*_*waz 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
Run Code Online (Sandbox Code Playgroud)

如果S<T>::S<T>()允许语法,那么在这种情况下你将不得不写X<T>::X<T><U>()- 这是一个丑陋的语法.所以从某种意义上说,通过防止这种情况,语法稍微清晰一些,也避免了引入语法.

另一方面,析构函数永远不可能是模板.