[temp.dep.type]/p7

如果嵌套名称说明符引用当前实例化的qualified-id不是当前实例化的成员或未知专门化的成员,则即使包含qualified-id的模板,该程序也是格式错误的没有实例化;无需诊断 . 类似地,如果对象表达式的类型是当前实例化的类成员访问表达式中的id-expression不引用当前实例化的成员或未知专业化的成员,则该程序甚至是格式错误的如果未实例化包含成员访问表达式的模板;无需诊断 . [示例:template <class T> class A {
typedef int type;
void f(){
A <T> :: type i; // OK:引用当前实例化的成员
typename A <T> :: other j; //错误:既不是当前实例化的成员,也不是
//未知专业化的成员
}
};

  • 结束例子]

[temp.res]/p8(省略不相关的部分):

了解哪些名称是类型名称允许检查每个模板的语法 . 该程序格式错误,无需诊断,如果:无法为模板生成有效的专业化或模板中的constexpr if语句且模板未实例化,或者...... [例如:int j;
template <class T> class X {
void f(T t,int i,char * p){
t = i; //如果X :: f被实例化则被诊断,并且对t的赋值是错误的
p = i; //即使X :: f未实例化,也可能被诊断出来
p = j; //即使X :: f未实例化,也可能被诊断出来
}
void g(T t){
; //即使X :: g未实例化,也可能被诊断出来
}
};
...... - 结束例子]


在我看来,如果满足[temp.dep.type] / p7中的条件,则不能为该模板生成有效的特化(例如,在[temp.dep.type] / p7的示例中,无效可以为声明 typename A<T>::other j; 生成特化,因此程序格式不正确;根据[temp.res] / p8无需诊断 .

[temp.dep.type] / p7是否被[temp.res] / p8所涵盖?如果没有,你能举个例子[temp.dep.type] / p7涵盖,但[temp.res] / p8不涵盖?