这是C++17中编译的具有非固定底层类型的constexpr静态从int强制转换到作用域枚举的未定义行为的后续问题(与作用域枚举的问题相同(。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一起编译。
我的问题是
- 这个应该编译吗
- 如果应该,为什么
请参阅另一篇文章,了解我认为它不应该为unscoped枚举编译的详细原因。同样的道理也适用于这个问题。
它不应该编译。这是一个编译器错误。CWG 1766中未定义它的原因是为了在常数表达式中诊断这种转换。
这是GCC错误#95701。我找不到Clang的漏洞。