C++11 中弱类型枚举的基础类型

2023-12-25

C++11 引入了强类型枚举,语法如下enum class。它们与整数类型不兼容,需要显式转换才能获取其数值。 C++11 还引入了为弱类型枚举指定存储类的能力,格式如下enum name : type {}。到这里为止都还好。

但看起来即使弱类型枚举具有给定的存储类,其项目的类型仍然是int。我尝试使用 Visual Studio 2012,11 月 CTP 版本。考虑以下代码:

enum charEnum : char { A = 'A' };
enum longEnum : long long { Tera = 1000000000000 };

void fct(char val) {}
void fct(int val) {}
void fct(long long val) {}

int main() 
{
    static_assert(sizeof(A) == sizeof(char), "check charEnum size");
    static_assert(sizeof(Tera) == sizeof(long long), "check longEnum size");
    fct('A');  // calls fct(char)
    fct(1);    // calls fct(int)
    fct(2ll);  // calls fct(long long)
    fct(A);    // calls fct(int) !
    fct(Tera); // calls fct(int), with truncation !
    fct((long long)Tera);  // calls fct(long long)
    return 0;
}

为枚举值调用的重载函数始终是fct(int),即使这会导致值被截断。当然,通过显式强制转换,我们可以调用重载函数,但这在传统的 C++03 语法中也是可能的。

我错过了一些明显的事情吗?这是为什么?有比显式强制转换更好的解决方法吗?


这是一个编译器错误。根据§7.2/9和§4.5/4:

§7.2/9:
枚举数或无作用域枚举类型的对象的值通过整数提升转换为整数 (4.5)

§4.5/4:
基础类型固定(7.2)的无作用域枚举类型的纯右值可以转换为其基础类型的纯右值。此外,如果整数提升可以应用于其基础类型,则基础类型固定的无作用域枚举类型的纯右值也可以转换为提升后的基础类型的纯右值。

最后一个应该转换为long long, not int. The char案件是一个争论点 https://stackoverflow.com/questions/14206403/why-does-a-value-of-an-enum-with-a-fixed-underlying-type-of-char-resolve-to-fct. (!)


测试程序:

#include <iostream>

enum charEnum : char      { A = 'A' };
enum longEnum : long long { Tera = 1000000000000 };

void fct(char val)      { std::cout << "fct(char)"      << std::endl; }
void fct(int val)       { std::cout << "fct(int)"       << std::endl; }
void fct(long long val) { std::cout << "fct(long long)" << std::endl; }

int main() 
{
    static_assert(sizeof(A)    == sizeof(char),      "check charEnum size");
    static_assert(sizeof(Tera) == sizeof(long long), "check longEnum size");

    fct('A');
    fct(1);
    fct(2ll);
    fct(A);
    fct(Tera);
    fct((long long)Tera);
}

MSVC2012NovCTP 输出:

fct(字符)
fct(整数)
fct(长长)
fct(整数)
fct(整数)
fct(长长)

g++ 4.7.1:

fct(字符)
fct(整数)
fct(长长)
fct(整数)
fct(长长)
fct(长长)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 中弱类型枚举的基础类型 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 使用 Codeigniter 发送电子邮件时出现问题 - 在邮件正文中发送标头

    codeigniter 中的电子邮件类出现奇怪的问题 当我直接向我的 Gmail 帐户电子邮件地址发送电子邮件时 效果很好 但是 如果我将电子邮件发送到不同的电子邮件地址并使用 POP3 将该电子邮件地址导入到 gmail 中 则由于某种原
  • 从分数列表生成标准竞赛排名

    给定分数列表 例如 5 5 4 2 2 0 我希望返回标准竞赛排名 1 1 3 4 4 6 From 维基百科的排名页面 http en wikipedia org wiki Ranking 这里是SRC的总结 标准竞赛排名 1224 排名
  • 如何在流星中响应式聚合 mongodb

    我是流星新手 我建立了发布 订阅的概念 我在反应式执行聚合时遇到以下错误 客户端代码 import Template from meteor templating import ReactiveVar from meteor reactiv
  • 在我的 virtualenv 中,我需要对所有命令使用 sudo

    我设置了一个virtualenv 这是有效的 但由于某种原因我需要使用sudo对于像这样简单的命令mkdir 显然我做错了什么 知道它可能是什么吗 Thanks 检查目录权限和所有者并给出 sudo chown R me me virtua
  • 模拟无法与 RSpec 和 Devise 配合使用

    我目前正在使用 RSpec 2 开发 Rails 3 Web 应用程序 并且我们使用 Devise 进行身份验证 我们的一个 很快还有许多 控制器要求用户登录 我知道 Devise 提供了sign in测试助手 但它可以与 RSpec 或
  • 在JPanel中调用setEnabled(false)的原因

    我现在在 Swing 上工作了一段时间 但在实践中从未遇到过需要打电话的情况setEnabled false in JPanel 尽管如此 我有时会在一些复杂的图形用户界面中看到这样的代码 但我真的不明白为什么有人想用它 所以 请给我一些现
  • 使用 React Router v4 / v5 的嵌套路由

    我目前正在努力使用 React Router v4 来嵌套路由 最接近的例子是路由配置React Router v4 文档 https react router now sh 我想将我的应用程序分成两个不同的部分 前端和管理区域 我在想这样
  • 按特定顺序执行测试套件

    我正在使用 maven failsafe 插件来触发 testng 套件 其配置类似于
  • 如何将 `getOrWaitUntilNonEmpty` 作为单个衬垫执行?

    我有一个高级代码结构 如下所示 val block gt Option Seq String val matches block get toArray 问题是这段代码可能会失败 即 get being None取决于时间 例如我是页 sc
  • “User”对象没有属性“get”

    我正在尝试构建一个ModelForm从这个解决方案here https stackoverflow com questions 862522 django populate user id when saving a model 但是我收到
  • 使用 pytest-django 对现有数据库运行测试

    有谁知道如何使用 pytest django 针对现有 例如生产 数据库运行 Django 测试 我知道 一般来说 这不是单元测试应该做的事情 但就我而言 我在 Heroku 上运行测试 默认情况下 Django 创建一个新的测试数据库 但
  • 在没有代理的 MS SQL 中实现每分钟事件

    我希望我的存储过程每分钟执行一次 但我无法访问 SQL Server 代理 使用 Windows 调度程序和 sqlcmd exe 将是最简单的
  • GitHub API (v3):按创建日期排序标签

    我在使用 GitHub API 时遇到了问题 我需要在单个标签之后创建的所有标签的列表 执行此操作的唯一方法是按日期比较标签 但是 API 的结果不是按日期排序的 API 的结果 rails 存储库示例 网络界面的结果 我所期望的是按日期排
  • PHP 等于 foreach 循环中的箭头运算符[重复]

    这个问题在这里已经有答案了 可能的重复 foreach ex as k gt v 中的 k gt v 是什么意思 https stackoverflow com questions 4758791 what does k v in fore
  • 追加 Blob 数据

    是否有一个函数可以附加 blob 数据JavaScript我目前使用以下方法 var bb new Blob Hello world 2 type text plain bb new Blob bb another data type te
  • 将blur.js 与angularjs 一起使用

    我正在尝试在 div 上制作带有角度的模糊背景效果 如上图所示 为此我正在使用blur js http blurjs com 使用 jquery 一切都可以正常工作 但真正的问题是使用 angularjs 可以实现这一点 最好的方法是什么
  • WPF 复选框:检查更改的处理

    在 WPF 数据绑定中 我可以将 IsChecked 属性绑定到某些数据 例如用户设置 但我需要处理 CheckChanged 事件 我知道我可以单独处理Checked 未选中事件 但是当这个值改变时有什么方法可以得到通知吗
  • data.table:lapply 具有多列输出的函数

    我正在使用一个函数smean cl normal来自 Hmisc 包 它返回一个具有 3 个值的向量 均值以及 CI 下限和上限 当我在一个data table对于 2 个组 我获得 2 列和 6 行 有没有办法获得与 2 个组相对应的两行
  • 在 TensorFlow 中在 NHWC 和 NCHW 之间转换

    将张量从 NHWC 格式转换为 NCHW 格式 反之亦然 的最佳方法是什么 是否有专门执行此操作的操作 或者我需要使用拆分 连接类型操作的某种组合 您所需要做的就是将维度从 NHWC 排列到 NCHW 或相反 每个字母的含义可能有助于理解
  • C++11 中弱类型枚举的基础类型

    C 11 引入了强类型枚举 语法如下enum class 它们与整数类型不兼容 需要显式转换才能获取其数值 C 11 还引入了为弱类型枚举指定存储类的能力 格式如下enum name type 到这里为止都还好 但看起来即使弱类型枚举具有给