msc*_*msc 1 c++ templates constructor c++11
从n4459:
635.模板的构造函数和析构函数的名称
允许定义构造函数的语法和类模板的析构函数之间存在差异.例如:
Run Code Online (Sandbox Code Playgroud)template <class> struct S { S(); ~S (); }; template <class T> S<T>::S<T>() { } // error template <class T> S<T>::~S<T>() { } // okay原因是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是"考虑到命名构造函数",这是不是一个模板?
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>()- 这是一个丑陋的新语法.所以从某种意义上说,通过防止这种情况,语法稍微清晰一些,也避免了引入新语法.
另一方面,析构函数永远不可能是模板.