根据第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';
}编辑
第7.2/5节: 如果基础类型没有固定,则每个枚举数的类型是其初始化值的类型: -如果为枚举器指定了初始化器,则初始化值具有与表达式相同的类型,且常量表达式应为整数常量表达式(5.19)。
发布于 2014-04-27 12:45:37
如果您没有显式地定义底层类型,那么编译器可以自由地选择适合这些值的整型。若要在C++11中设置基础类型,可以使用以下方法:
enum A : char { a = 1, b, c };
^^^^^^如果使用char,您的方式不会强迫编译器使用int。
发布于 2014-04-27 12:42:25
这是实现定义的:一个enum的所有值都符合,比如说,一个uint8_t并不强制编译器为枚举选择一个单字节的表示。
枚举的基础类型是一个整体类型,可以表示枚举中定义的所有枚举数值。它是实现定义的哪种整数类型被用作枚举的基础类型,除非枚举器的值不能适合于int或
unsigned int,否则基础类型不得大于int。(强调后加)
在您的示例中,编译器实现者似乎选择了一个int,它在您的平台上花费四个字节--这是一个非常有效的选择。
发布于 2014-04-27 12:42:55
引用的子句7.2/5描述了枚举器的类型。但是枚举数只构成枚举定义的一部分。枚举的底层类型足够大,足以容纳所有枚举数的值,但必须符合7.2/6:
它是实现定义的,使用哪种整数类型作为基础类型,但基础类型不得大于
int,除非枚举器的值不能适合于int或unsigned int。
因此,可以保证基础类型不大于int (因为int可以表示0、1和2)。确实,第一个枚举器的类型是枚举定义中的char,但是所有实际枚举值都是A类型。要实际控制底层类型,可以使用枚举基语法(例如enum A : char),并使用std::underlying_type特征来查询它。
如果您实际上希望在定义中看到枚举数类型的效果,可以尝试如下所示:
enum Foo { a = '\010', b = sizeof(a) };
std::cout << typeid(b).name() << "\n"; // some variant of "Foo"
std::cout << b << "\n"; // "1"
std::cout << sizeof(b) << "\n"; // implementation-defined, not greater
// than sizeof(int)https://stackoverflow.com/questions/23323510
复制相似问题