c++ 枚举中如何处理常量表达式?

克拉什

带有常量表达式的 c++ 枚举的范围是多少?这是我的代码

#include <iostream>

int main(){
    enum e3{min = -10, max = 100000};
    e3 x = e3(-1000);
    e3 y= e3(-100000912241);
    std::cout<<x<<" "<<y<<std::endl;
}

它输出 -1000 -1216664433

这是怎么回事?此外,The C++ programming language by Bjarne Stroustrup指定整数类型到枚举的转换结果是未定义的,除非值在枚举范围内。这个范围是多少,如何计算?

拔示巴

anenum的范围是基础类型的范围。编译器可能已选择 anint作为您的enum.

允许这样做,因为 an int(假设它在您的平台上是 32 位)可以包含您给它的所有显式值。

您可能会发现您的平台上的类型-100000912241是 along或 a long long(请注意,C++ 中没有否定字面量:-100000912241是字面量100000912241.的一元否定)。但是-100000912241不能适应那个int,所以你的代码的行为是undefined

如果要检查 的基础类型enum,请使用std::underlying_type.

参考:http : //en.cppreference.com/w/cpp/types/underlying_type

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 C# 中创建常量表达式

C中的常量表达式-如何哈希字符串?

C ++ 11之前的“常量表达式”

静态断言C ++-常量表达式错误

std :: addressof作为C ++ 17中的常量表达式

C ++ 11 constexpr函数中的常量表达式字符串参数

C结构对象堆栈-常量表达式中不允许函数调用(错误)

为什么const int x = 5; 在C中不是常量表达式?

C ++ 11中常量表达式的模板int参数

C ++ 11标准中的核心常量表达式是什么?

C ++:“(静态const双变量)不能出现在常量表达式中”

C ++ string.length()在常量表达式中不可用

C中的“声明不允许在此处”和“常量表达式”错误

具有常量表达式的初始化程序可能在C99中溢出

像C ++ constexpr这样的ANSI-C常量表达式函数?

在C#编译器和虚拟机中如何处理lambda表达式?

枚举属性中的变量:需要常量表达式

使用C ++ 20 <=>将std :: variant与int比较不是常量表达式

两个指针之间的区别是合法的c ++ 17常量表达式吗?

致命错误C1017:使用“ #if(false)”时无效的整数常量表达式

用C语言编程:预期的常量表达式错误

'this'不能在带有this->指针变量的常量表达式错误(C ++)中使用

const_cast在常量表达式中有效吗?(C ++ 14,C ++ 17)

如何在注释处理器中捕获常量表达式?

表达式在C ++ VS中未求出常量

C是否允许在数组初始值设定项列表中使用非常量表达式?

为什么 C++20 范围适配器的返回视图不是常量表达式?

C#设置大小写常量表达式,它们是否必须遵循特定顺序?

C ++ 1y / C ++ 14:不允许在常量表达式中分配对象的生存期吗?