为什么“reinterpret_cast”的行为不像C++标准所说的那样

Why does `reinterpret_cast` not behave as the C++ standard says?

本文关键字:C++ 标准 reinterpret cast 为什么      更新时间:2023-10-16

reinterpret_cast的条目中,cppref 说:

整数、枚举、指针或指向成员的指针的表达式 类型可以转换为自己的类型。结果值与表达式的值相同。(自C++11起(

但是,无法编译以下代码(带有-std=c++1z的clang 5.0(:

enum class A : int {};
int main()
{
    A a{ 0 };
    reinterpret_cast<int>(a); // error : reinterpret_cast from 'A' to 'int' is not allowed
}

为什么reinterpret_cast的行为不像C++标准所说的那样?

a的类型是A,而不是int。语法enum class A : int使int成为A的基础类型,这是一种特殊关系,但不是"is-a"关系。

(static_cast将执行此转换。

int

"基础类型",但枚举本身是单独的类型。

从 [dcl.enum]/5:

每个枚举定义一个不同于所有其他类型的类型。每个枚举还有一个基础类型。可以使用枚举基显式指定基础类型。