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

时间:2015-03-17 22:35:49

标签: c++ enums language-lawyer

7.2 / 6(C ++ 14):

  

其基础类型已修复的枚举是不完整类型   从宣言(3.3.2)到紧接其后    enum-base (如果有的话),此时它变成一个完整的类型。其基础类型未修复的枚举是不完整类型   从它的声明点到关闭后的立即   它的枚举说明符,此时它就变成了一个完整的类型。

请查看下面的代码段(请参阅live example):

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在枚举的 enum-base 之后声明,其基础类型是固定的,就像在关闭t之后立即声明}一样。枚举器的枚举说明符,其基础类型未修复。

1 个答案:

答案 0 :(得分:2)

问题不在于B没有完成。如您自己的引用所示,它在 enum-base : int之后立即完成。问题是你正在使用语法不允许的构造。

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

  1. elaborated-type-specifier
  2. 枚举说明符
  3. 包含enum elaborated-type-specifier 看起来像([dcl.type.elab])

      

    enum nested-name-specifier opt identifier

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

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

      

    enum-head { 枚举器列表 opt }
       enum-head { 枚举列表 , }

    没有深入研究 enum-head 是什么,显然这需要大括号,而不是你的代码。

    enum class B : int; opaque-enum-declaration ,其语法为

      

    enum-key attribute-specifier-seq opt identifier enum-base opt ;

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

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