试图理解 §7.2/6 中的 C++14
Trying to understand §7.2/6 in C++14
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]):
- 在详细说明的类型说明符中
- 在枚举说明符中
包含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
是多余的。
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- 追问:C++14/C++17 中的变量到底是什么?
- 在 C++14 中的 for 循环中并行网络下载
- 由于 2D 数组声明,C++ 14 中的运行时错误
- 继承 C++14 中的模板化运算符 =:g++ 和 clang++ 的不同行为
- 如何跟踪 C++14 中的控制台应用程序启动的次数?
- C 14中的乘数交叉线程通信
- 在扣除C++14中的"auto"之前使用"auto func(int)"
- VS 中的 C++ 17 会导致 C++14 中不存在的变量(重新)评估错误
- 可靠地确保C++ 14 中的内存安全
- 对 C++14 中的数组的自动右值引用(不带 &&)
- C++14 中的模板化函数参数
- C++14/17中的懒惰评估-只有lambdas或期货等
- 检测 C++ 14 中的 constexpr size() 成员函数
- Visual Studio 14.0 和 Windows 工具包中的错误包括文件夹
- 如何将成员函数绑定到 C++14 中的对象
- 试图理解 §7.2/6 中的 C++14
- Ideone中的c++ 14和c++ 5.1有什么不同?
- clang和gcc中的c++ 14可变模板参数推断