模板专业化中的双模板<>

vso*_*tco 9 c++ templates

为什么下面的代码编译?我没有专门化模板类的模板成员函数,因此只template<>应使用一个.但是,g ++编译它没有任何警告,clang ++只给出一个警告

警告:模板特化中的无关模板参数列表

template<typename T>
struct S{};

template<> template<> // why can we do this? 
struct S<int>{};

int main()
{

}
Run Code Online (Sandbox Code Playgroud)

use*_*267 4

因为语法允许它,并且模板专业化部分下似乎没有任何内容禁止它:

来自 [gram.temp]

显式专业化

template < > 宣言

来自 [gram.dcl]

宣言

[...]

显式专业化

自 2001 年以来,语法过于宽松的事实一直在活跃问题列表中(#293)。