【问题标题】:Why does `reinterpret_cast` not behave as the C++ standard says? [duplicate]为什么`reinterpret_cast` 的行为不像 C++ 标准所说的那样? [复制]
【发布时间】:2017-03-25 04:17:25
【问题描述】:

reinterpret_cast的入口处,cppref说:

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

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

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++ 标准所说的那样?

【问题讨论】:

  • 那句话没有提到reinterpret_cast&lt;int&gt;(a);。它确实说明了reinterpret_cast&lt;A&gt;(a);

标签: c++ c++11 casting type-conversion standards


【解决方案1】:

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

static_cast 将执行此转换。)

【讨论】:

    【解决方案2】:

    int 是“底层类型”,但枚举本身是一个单独的类型。

    来自 [dcl.enum]/5:

    每个枚举都定义了一个不同于所有其他类型的类型。每个枚举也有一个基础类型。可以使用 enum-base 显式指定基础类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多