c++ - 从 int 到具有非固定基础类型的无范围枚举的 constexpr 静态转换的未定义行为在 C++17 中编译
问题描述
这是 constexpr static cast from int to scoped enum 的未定义行为的后续问题,在 C++17 中使用非固定基础类型编译(范围枚举的问题相同)。TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举)。
我想知道以下是否应该或不应该在 C++17 中编译
enum E
{
A, B
};
constexpr E x = static_cast<E>(2);
这在 Ubuntu 20.04 上与 GCC 9.3.0 和 Clang 10.0.0 一起编译。
我的问题是
- 这应该编译吗?
- 如果应该,为什么?
有关我认为它不应该为无范围枚举编译的详细原因,请参阅另一篇文章。同样的推理也适用于这个问题。
解决方案
它不应该编译。这是一个编译器错误。在CWG 1766中未定义它的原因是,这种转换将在常量表达式中得到诊断。
这是GCC 错误 #95701。我找不到 Clang 的开放错误。
推荐阅读
- dataframe - 如何从相同df的两列的映射中更改Pyspark数据框中列的值
- c# - 如何在 .NET Core 运行时设置 Sentry 日志级别?
- r - 使用 R 拆分具有由标题分隔的多组数据的 CSV 并创建标识列
- r - 从单列数据中提取不同的向量(在 R 中)
- javascript - 即使在使用 display:hidden 隐藏对象后网页中的空白
- python - 删除字典列表周围的字符串引号
- python - sphinx_automodapi 扩展 - 为类继承图跳过一个类
- c# - 即使使用 NOCHECK CONSTRAINT,SQL Server 也会引发错误“DELETE 语句与 REFERENCE 约束冲突”
- python - 为什么 Visual Studio Code 中的 Python repl 告诉我我的对象未定义?
- java - 数组的排名值