表达式中使用的枚举器是否与其枚举的基础类型具有相同的类型?
Does enumerator used in expression have the same type as underlying type of its enum?
枚举常量在无作用域枚举定义之外使用时,枚举常量的类型是什么?
请考虑以下代码:
#include <iostream>
enum modes
{
begin = 0,
end = 1
};
int main()
{
std::cout << std::boolalpha
<< std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value
<< std::endl;
std::cout << sizeof(modes) << std::endl;
std::cout << (-100 + end) << std::endl;
}
这在我的机器上产生:
true
4
-99
现在,如果我只更改其他枚举器的值,begin
更改为2147483648
,那么我的输出变为:
true
4
4294967197
显然,这意味着,end
类型已经从int
变为unsigned int
,甚至底层modes
类型仍然相同(即unsigned int
(。
关于枚举的整体促销是否有一些特殊规则?
来自C++标准(7.2枚举声明(
- ...在枚举说明符的右大括号之后,每个枚举器都有其枚举的类型。...
和(4.5 积分促销(
3 基础类型为 不固定 (7.2( 可以转换为第一个 prvalue 以下可以表示枚举的所有值的类型 (即 bmin 到 bmax 范围内的值,如 7.2 中所述(:int, 无符号整数、长整型、无符号长整型、长整型或无符号 长长如果该列表中的任何类型都不能表示所有 枚举的值,无作用域枚举类型的 prvalue 可以转换为扩展整数类型的 prvalue 具有最低 整数转换秩 (4.13( 大于 long long 的秩 可以表示枚举的所有值。如果有 是两种这样的扩展类型,选择签名的类型。
枚举常量在无作用域枚举定义之外使用时,枚举常量的类型是什么?
当然,这是枚举类型。begin
的类型是modes
.如果它有一个积分类型,你关于枚举积分提升的问题就没有意义了。
使用枚举进行积分促销是否有一些特殊规则?
没有。您正在考虑枚举基础类型的积分提升,但这是不同的。对于枚举类型本身,需要考虑枚举类型的有效值范围,该范围可以小于枚举基础类型的有效值范围。int
可以表示所有有效值吗?如果是这样,你会从中得到int
。
相关文章:
- 在有符号基础类型枚举的位域上溢出
- 在编译时将强类型枚举器转换为其基础类型?
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 类型枚举的变量不是类型名称
- 强类型枚举的语法实现错误
- 枚举与强类型枚举
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 如何使用强类型枚举
- QT:将强类型枚举参数传递到插槽
- 在类定义中声明类型(枚举、结构等)会增加代码大小
- Visual Studio 11 (beta) 中的强类型枚举类
- 使用强类型枚举对类型和子类型进行建模
- 不允许将强类型枚举用作同一基础类型的参数
- 如何正确使用C++强类型枚举
- 带有强类型枚举的模板参数推导
- 是否可以在googleprotobuf中为类型(枚举或消息)定义一个别名
- C++中默认初始化的全局强类型枚举是什么
- std::is_signed不适用于强类型枚举:int
- 如何定义自定义值的类型?(枚举类型定义)
- 将强类型枚举传递给函数