代码不应该打印"1 1"而不是"4 4"吗?

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.


das*_*ght 5

这是实现定义的:事实上enum,例如a uint8_t中的所有拟合值都不会强制编译器为枚举选择单字节表示.

枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int.(重点补充)

在您的情况下,似乎编译器实现者选择一个int,在您的平台上占用四个字节 - 一个完全有效的选择.