gpt4 book ai didi

c++ - 为什么不透明枚举声明不是定义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:31 25 4
gpt4 key购买 nike

§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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com