Wak*_*zil 13 c++ language-lawyer c++11
根据§7.2/ 5和§7.2/ 6,下面的代码不应该打印1 1而不是4 4?
#include <iostream>
enum A { a = (char)1, b, c }; // underlying type is not fixed
int main() {
std::cout << sizeof(a) << ' ' << sizeof(A) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
编辑
从§7.2/ 5开始:
如果基础类型未修复,则每个枚举器的类型是其初始化值的类型:
- 如果为枚举数指定了初始值设定项,则初始化值与表达式具有相同的类型,而常量表达式应为整数常量表达式(5.19).
mas*_*oud 20
如果没有显式定义基础类型,那么编译器可以自由选择适合值的整数类型.要在C++ 11中设置基础类型,您可以使用:
enum A : char { a = 1, b, c };
^^^^^^
Run Code Online (Sandbox Code Playgroud)
你的方式不会强迫编译器使用charif int.
这是实现定义的:事实上enum,例如a uint8_t中的所有拟合值都不会强制编译器为枚举选择单字节表示.
枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或
unsigned int.(重点补充)
在您的情况下,似乎编译器实现者选择一个int,在您的平台上占用四个字节 - 一个完全有效的选择.