gpt4 book ai didi

c++ - C++ 枚举访问语义背后的基本原理

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:31 26 4
gpt4 key购买 nike

有人可以阐明访问 C++ 类中定义的枚举的语义吗?

特别是,为什么枚举成员是通过类的名称而不是枚举本身来访问的?鉴于 enum 是容器/范围,就像 namespaceclass 一样,为什么访问容器的元素时会受到不同的对待一个 enum 而不是一个 class

给定

namespace mynamespace
{
class myclass
{
public:
enum myenum
{
enum1,
enum2
};

int myint;
};
}

为什么 enum1 的完全限定名称 mynamespace::myclass::enum1 而不是 mynamespace::myclass::myenum::enum1?

虽然后者“有效”,但它不是“推荐”的调用方式,一些编译器会在那里发出警告。恕我直言,它不仅应该是正确的,而且还应该是访问它的唯一方式。

这会产生非常奇怪的访问规则,并且当您在不同的枚举中添加新的 enum1 时(此时您必须添加限定符)会使事情变得非常奇怪。

真的,它违背了枚举的目的。枚举的成员实际上是类的成员,而不是枚举的成员,我必须说我发现其他语言(例如 C#)中的行为更可取。

我想这是为了保持与 C 的兼容性,但我不明白为什么在访问语义中要求枚举名称会是更好的选择...我想制作名称可选将是保留 C 兼容性的选项。

最佳答案

在 C++03 中,与在 C 中一样,enum 不引入新的作用域。定义的名称进入周围范围。这可能是命名空间或类。

C++11 添加了作用域枚举和基枚举。

普通 C++03 枚举:

enum Cpp03 { a, b, c };

C++11 基于枚举:

enum Cpp11Based: long { a, b, c };

C++11 scoped enum(充当名称的范围,就像在您的示例中一样):

enum class Cpp11Scoped1 { a, b, c };
enum struct Cpp11Scoped2 { a, b, c };

最后两种形式是等价的,并且允许写成例如Cpp11Scoped1::a

最后,一个作用域的枚举可以基于(指定名称的底层类型,即大小和符号):

enum class Cpp11ScopedAndBased: long { a, b, c };

一些 C++03 编译器,包括 Visual C++,也为普通的 C++03 enum 提供作用域功能。

我猜您遇到的是语言扩展。

关于c++ - C++ 枚举访问语义背后的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814074/

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