C++模板语境下的member enumeration(成员枚举)含义是什么?
C++模板语境下member enumeration术语说明
术语定义
member enumeration 即成员枚举,指定义在类、结构体、联合体等用户自定义类型作用域内部的枚举类型,包含有作用域枚举(enum class/enum struct)和无作用域枚举两类,和你初步的推测一致。
13.1.2条款的正确语境
你对该条款的解读存在偏差:条款中提到「模板声明中的声明可以定义成员枚举」,指的是类模板/成员类模板的内部成员列表中,可以声明定义成员枚举,而非允许将枚举本身声明为模板。
C标准明确允许作为模板声明的实体仅包含:类、函数、变量(C14起)、类型别名(C11起)、概念(C20起),枚举类型不在可声明为模板的实体范围内,因此你尝试给枚举直接加template前缀的写法本身就是不合法的,MSVC报C3113错误完全符合标准要求。
合法示例
以下是符合13.1.2条款要求的、模板语境下的成员枚举写法:
// 类模板 template<typename T> struct S { // 类模板内部的成员枚举,即条款中所指的场景 enum class e { i = 0, }; }; // 使用示例 auto val = S<int>::e::i;
内容的提问来源于stack exchange,提问作者Brotcrunsher
相关产品推荐
相关产品推荐

