constexpr 静态从 int 转换为具有非固定基础类型的无作用域枚举的未定义行为在 C++17 中编译
Undefined behavior of constexpr static cast from int to unscoped enum with non-fixed underlying type compiles in C++17
这是 的后续问题(scoped 枚举的相同问题)。
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 进行编译。
我的问题是
- 这应该编译吗?
- 如果应该,为什么?
查看其他 post 以了解为什么我认为它不应该为 unscoped 枚举编译的详细推理。同样的道理也适用于这个问题。
它不应该编译。这是一个编译器错误。它在 CWG 1766 中未定义的原因是为了在常量表达式中诊断此转换。
这是GCC bug #95701。我找不到 Clang 的开放错误。
这是
我想知道以下是否应该在 C++17 中编译
enum E
{
A, B
};
constexpr E x = static_cast<E>(2);
这可以在 Ubuntu 20.04 上使用 GCC 9.3.0 和 Clang 10.0.0 进行编译。
我的问题是
- 这应该编译吗?
- 如果应该,为什么?
查看其他 post 以了解为什么我认为它不应该为 unscoped 枚举编译的详细推理。同样的道理也适用于这个问题。
它不应该编译。这是一个编译器错误。它在 CWG 1766 中未定义的原因是为了在常量表达式中诊断此转换。
这是GCC bug #95701。我找不到 Clang 的开放错误。