- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
§3.1/2 说 opaque-enum-declaration 是一个不是定义的声明。尽管如此,它仍占用内存空间。将其与同样具有大小的类定义 进行比较。两者都是标准的完整类型。为什么一个是声明,一个是定义?
#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';
}
输出
4
1
编辑
据我所知,下面的不透明枚举声明 enum A : int;
是这样定义的。
#include <iostream>
enum A : int; // opaque-enum-declaration
int main() {
A a;
std::cout << a << '\n';
}
编辑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';
}
最佳答案
类型是完整的,尽管在opaque-enum-declaration 之后没有定义:
7.2 [dlc.enum]/3
An opaque-enum-declaration is either a redeclaration of an enumeration in the current scope or a declaration of a new enumeration. [ Note: An enumeration declared by an opaque-enum-declaration has fixed underlying type and is a complete type.( The list of enumerators can be provided in a later redeclaration with an enumspecifier. —end note ] A scoped enumeration shall not be later redeclared as unscoped or with a different underlying type. An unscoped enumeration shall not be later redeclared as scoped and each redeclaration shall include an enum-base specifying the same underlying type as in the original declaration.
上面的完整类型意味着你可以在看到opaque-enum-declaration之后使用sizeof
,这似乎是您关心的问题。它仍然不是定义,因为定义需要指定类型的所有方面,opaque-enum-declaration 不需要。
如果您将其与类定义进行比较,opaque-enum-declaration 将等同于包含所有非静态数据成员和一个属性的类 [half] 定义将存在虚函数,但不声明任何成员函数。对象的大小会很清楚,但不知道如何使用它。
关于c++ - 为什么不透明枚举声明不是定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23341484/
我是一名优秀的程序员,十分优秀!