试图理解 §7.2/6 中的 C++14

Trying to understand §7.2/6 in C++14

本文关键字:中的 C++14      更新时间:2023-10-16

7.2/6(C++14):

基础类型固定的枚举是不完整类型从其声明点(3.3.2)到其声明点之后enum-base(如果有),此时它将成为一个完整的类型。基础类型未固定的枚举是不完整的类型从声明点到结束后立即其枚举说明符,此时它将成为一个完整的类型。

看看下面的代码片段(参见实际示例):

enum A{} t;                 // enum A{} is a complete type (OK)
enum class B:int z;         // enum class B:int is not a complete type
int main()
{
}

我理解为什么B不是一个完整的类型。但是,只要看上面的段落,我就不太清楚了。z是在枚举的枚举基之后声明的,其基础类型是固定的,就像t是在枚举器的enum说明符的结束}之后声明的一样,其基础型型不是固定的。

问题不在于B不完整。如您自己的报价所示,它在其枚举基: int之后立即完成。问题是你使用了语法不允许的结构。

类型说明符生成允许关键字enum出现在其中的两种方式([dcl.type]):

  1. 详细说明的类型说明符
  2. 枚举说明符

包含enum详细类型说明符看起来像([dcl.type.elab])

enum嵌套名称说明符opt标识符

它不适合您的代码,而且不能声明新的类型(请参见[basic.ulookup.elab]/p2)。也就是说,虽然struct A* pa;是合法的,即使没有A的先前声明,enum B * pb;也是不合法的。

枚举说明符([dcl.enum]/p1)是之一

枚举头{列举器列表opt}
枚举头{枚举器列表,}

如果不深入了解枚举头是什么,很明显这需要大括号,而大括号不在代码中。

enum class B : int;不透明枚举声明,其语法为

枚举键属性说明符seqopt标识符枚举基option;

这不允许您声明枚举本身以外的任何内容。

简而言之,语法根本不允许enum class B:int z;。相反,您可以编写完全有效的enum class B:int; B z;,尽管: int是多余的。