为什么关键字模板可以出现在由 class-head-name 形成的qualified-id中

jac*_*k X 7 c++ templates language-lawyer

考虑以下两个示例:

template<class>
struct A{
  template<class...>
  struct B{};
};
template<class T>
template<class U>
struct A<T>::template B<U>{  // Notice this declaration
}; 
int main(){
}
Run Code Online (Sandbox Code Playgroud)

此代码被除 GCC 7.x 之外的所有编译器接受。但是,IIUC,我不得不说B<U>语法不应该支持的声明,我的原因是: class#nt:class-head-name

嵌套名称说明符opt类名

之前没有可选的关键字模板class-name,所以应该是无效的声明,就目前而言,我认为GCC 7.x是对的。

另一个例子是:

#include <iostream>
template<class>
struct A{
    template<class>
    struct B{
       template<class...>
       struct C;
    };
};
template<class T>
template<class U>
template<class Y>
struct A<T>::template B<U>::C<Y>{  // #2

};
int main(){

}

Run Code Online (Sandbox Code Playgroud)

根据这个规则:
temp.names#4

如果关键字模板出现在模板参数列表或声明类型说明符之外,则称它出现在限定 ID 的顶层。在 declarator-id的qualified -id 或由 class-head-name 或 enum-head-name 构成的qualified-id 中,关键字模板不得出现在顶层

如前所述,第一种情况可能会被相关语法禁止。相反,根据 [temp.names#4],第二种情况应该仍然是无效声明。规则显式表示关键字template不应出现在由类头名称形成的限定 ID 中的顶级。那么,我想知道为什么所有编译器都可以接受第二种情况?

如何解释这两个例子,class-head-name 的语法和规则 [temp.names#4]?