4
为什么下面的代码没有任何错误地编译?为什么我允许使用不完整的枚举类?
enum class Enumeration;
void func()
{
auto enumeration = static_cast<Enumeration>(2);
auto value = static_cast<int>(enumeration);
}
为什么下面的代码没有任何错误地编译?为什么我允许使用不完整的枚举类?
enum class Enumeration;
void func()
{
auto enumeration = static_cast<Enumeration>(2);
auto value = static_cast<int>(enumeration);
}
它编译因为编译器在编译时知道的Enumeration
大小(这恰好是空的)。
你看它明确使用的语法如下:
enum class Enumeration : short;
编译器知道一切有了解的Enumeration
。 Enumeration
是不透明枚举声明,这意味着该类型也是complete
,即您可以使用sizeof
。如果需要,您可以在稍后的重新声明中指定列举者列表(除非重新声明显然带有不同的基础类型)。
请注意,由于您使用的是enum class
,因此使用static_cast
是强制性的。
int
,但你可以放心地使用static_cast
他们来检索他们的积分值。毕竟他们还是enum
。
有从作用域 枚举积分类型的值的隐式转换,尽管的static_cast可以用于 获得枚举的数值。
更多关于这个话题在这里:How to automatically convert strongly typed enum into int?
的可能的复制[?为什么是枚举类的临时允许用任意值的初始化(https://stackoverflow.com/questions/30852922/why-is- enum-class-temporaries-with-arbitrary-values-allowed) – anatolyg
有没有理由不应该这样做? –
您已决定a:_“不透明枚举声明:定义枚举类型但不枚举:在此声明之后,该类型是完整类型并且其大小已知。”_ source:http://en.cppreference.com/w/cpp/language/enum –