繁体   English   中英

在嵌套名称说明符中使用简单模板 ID 是否明确表示 class 模板专业化?

[英]Does the use a simple-template-id in a nested-name-specifier unambiguously mean a class template specialization?

struct A{
    template<typename U>
    void T(){}
};
struct B{
    template<typename U>
    struct T{
       using type = U;
    };
};
struct C:A,B{

};
int main(){
    C::T<int>::type d;
}

GCC 和 Clang 均不接受此示例

根据basic.lookup.qual#1

class 或命名空间成员或枚举器的名称可以在:: scope 解析运算符 ([expr.prim.id.qual]) 后引用,该解析运算符 ([expr.prim.id.qual]) 应用于表示其 ZA2F2ED4F8EBC2CBB4C21、命名空间或 enDCum 的嵌套名称说明符如果嵌套名称说明符中的 a:: scope 解析运算符前面没有 decltype-说明符,则查找前面的名称::仅考虑其特化为 types 的名称空间、类型和模板

这意味着在查找模板名称T的声明时, T的特化应表示此上下文中的类型。 另一方面,根据class.member.lookup#4

如果 C 包含名称 f 的声明,则声明集包含在 C 中声明的每个满足查找发生的语言构造要求的f 声明。

同样,当在 C 的C中查找模板T时,此查找应仅考虑那些特化为类型的模板。 C 的C没有任何T声明,因此将在其每个基类中对S(T,C)执行查找。 A中的模板T不满足要求。 同时, B的 scope 中声明的模板T确实满足要求。 所以查找不是模棱两可的, B::T是唯一的结果。 这意味着C::T<int>::type d应该格式正确。 为什么 GCC 和 Clang 都拒绝这个例子? 它可以被认为是两者的错误吗? 如果我遗漏了什么,那么这个例子不正确的原因是什么?

查找T所需的前瞻取决于::即使对<的解释取决于T的含义被认为是不可取的。 因此,查找后跟<的名称不限于类型和命名空间,无论以后找到任何>:: P1787R6修复了这个问题,将特殊查找限制为紧跟::的标识符(因为其他类型的名称无论如何都不能引用类型或命名空间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM