Wak*_*zil 5 c++ language-lawyer c++11
第3.1 / 2节说,不透明枚举声明是不是定义的声明。但是,它占用内存空间。将其与也具有大小的类定义进行比较。两者都是标准的完整类型。为什么一个是声明,另一个是定义?
#include <iostream>
enum A : int; // opaque-enum-declaration
class B{}; // a class definition
int main() {
std::cout << sizeof(A) << '\n';
std::cout << sizeof(B) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出量
4
1个
编辑
enum A : int;据我所知,下面的不透明枚举声明已定义。
#include <iostream>
enum A : int; // opaque-enum-declaration
int main() {
A a;
std::cout << a << '\n';
}
Run Code Online (Sandbox Code Playgroud)
编辑1
就变量a而言,先前的代码段与下面的代码段没有区别。它们都使变量未定义。因此,很难接受那enum : int;是一个声明和enum A : int {quick, brown, fox};一个定义。
#include <iostream>
enum A : int {quick, brown, fox};
int main() {
A a;
std::cout << a << '\n';
}
Run Code Online (Sandbox Code Playgroud)
该类型是完整的,尽管未在opaque-enum-declaration之后定义:
\n\n\n\n\n7.2 [dlc.枚举]/3
\n\n不透明枚举声明要么是当前作用域中枚举的重新声明,要么是新枚举的声明。[ 注意:由 opaque-enum-declaration 声明的枚举具有固定的基础类型,并且是完整类型。(枚举数列表可以在稍后使用枚举说明符重新声明时提供。\xe2\x80\x94end note ] 作用域枚举稍后不得重新声明为无作用域枚举或具有不同的基础类型。无作用域枚举不得稍后重新声明为作用域,并且每个重新声明应包含一个枚举基,指定与原始声明中相同的基础类型。
\n
上面的完整类型意味着您可以sizeof在看到opaque-enum-declaration后使用,这似乎是您所关心的。它仍然不是一个定义,因为定义需要指定类型的所有方面,而opaque-enum-declaration则不需要。
如果要将其与类定义进行比较,则opaque-enum-declaration将相当于类 [half] 定义,其中包含所有非静态数据成员和一个说明是否存在虚函数的属性,但不声明任何虚函数的成员函数。对象的大小会很清楚,但如何使用它却不清楚。
\n| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |