gpt4 book ai didi

c++ - 为什么作用域枚举允许使用 |使用先前分配的值进行初始化时的运算符?

转载 作者:可可西里 更新时间:2023-11-01 15:09:49 24 4
gpt4 key购买 nike

我正在将无作用域枚举转换为有作用域枚举,遇到了一个难题。

Stroustrup,C++ 编程语言,第 4 版,第 8.4.1 节,范围枚举类未隐式转换为整数类型的文档,并为运算符提供代码 |& 作为如何使用 static_cast 来解决这个问题的示例。

在先前定义的 enum 值上使用 | 运算符进行以下初始化不应该是非法的吗?

enum class FileCopy {
PreviousHDUs = 1,
CurrentHDU = 2,
FollowingHDUs = 4,
AllHDUs = PreviousHDUs | CurrentHDU | FollowingHDUs,
CurrentHeader = 8
};

int main()
{
std::cout << static_cast<int>( FileCopy::AllHDUs) << "\n";
}

我已经在 Wandbox 上使用 clang 和 gcc HEAD 以及 --pedantic-errors 对其进行了测试,它编译并返回了预期的输出,7。这并不是说它是合法的,只是它似乎被编译器接受了。

这是明确记录的行为吗?我一直无法解析 documentation以描述此行为的方式。

最佳答案

[dcl.enum]/5:

... If the underlying type is fixed, the type of each enumerator prior to the closing brace is the underlying type ...

也就是说,在遇到右大括号之前,每个枚举器的类型都是 int。在那之后,枚举器的类型为 FileCopy,您将无法再像这样对它们进行按位或运算。

关于c++ - 为什么作用域枚举允许使用 |使用先前分配的值进行初始化时的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379757/

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