【问题标题】:reinterpret_cast error for enum枚举的 reinterpret_cast 错误
【发布时间】:2012-08-27 01:14:34
【问题描述】:

为什么我不能使用 reinterpret_cast 操作符进行这样的转换?

enum Foo { bar, baz };

void foo(Foo)
{
}

int main()
{
   // foo(0); // error: invalid conversion from 'int' to 'Foo'
   // foo(reinterpret_cast<Foo>(0)); // error: invalid cast from type 'int' to type 'Foo'
   foo(static_cast<Foo>(0)); 
   foo((Foo)0);
}

【问题讨论】:

  • static_cast 是这里的正确操作。
  • 为什么有效?你认为 reinterpret_cast 是干什么用的?
  • 我认为 reinterpret_cast 可以用于所有类型的转换,因为它会强制将任何类型转换为另一种类型,并具有此转换的所有副作用。

标签: c++ enums static-cast


【解决方案1】:

我认为reinterpret_cast 可用于所有类型的强制转换,因为它强制将任何类型强制转换为具有此转换的所有副作用的另一种类型。

这是一个常见的误解。可以使用reinterpret_cast 执行的转换在标准的 5.2.10 中明确列出。 int-to-enumenum-to-int 转换不在列表中:

  • 指向整数类型的指针,只要整数足够大就可以容纳它
  • nullptr_t 转整数
  • 整型或enum指向指针
  • 指向另一个不同类型的函数指针的函数指针
  • 对象指针指向另一个不同类型的对象指针
  • nullptr_t 指向其他指针类型
  • 如果T1T2 都是对象或函数,则T1 的成员指针指向T2 的不同成员指针

reinterpret_cast 通常用于告诉编译器:嘿,我知道您认为该内存区域是 T,但我希望您将其解释为 U(其中 TU 是不相关的类型)。

还值得注意的是reinterpret_cast 可以对位产生影响:

5.2.10.3

[ 注意:reinterpret_cast 执行的映射可能会或可能不会产生表示差异 从原始值传来。 ——尾注]

C 风格的演员表总是有​​效的,因为它在尝试中包含了static_cast

【讨论】:

    【解决方案2】:

    因为常规枚举基础类型是int,所以reinterpret 没有任何内容。对于这种情况,静态转换是正确的转换。

    【讨论】:

    • @Rost 这不是真的。该标准保证 emum 的底层类型是 integral type,但不一定是 int
    • @tenfour 嗯,它是在 C++11 中添加的。不知道原因。可能允许一些模板技巧?
    • 如果“没有什么可以重新解释”与正确性有关,那么这将失败:int x = 0; int* p = reinterpret_cast&lt;int*&gt;(&amp;x);
    • @TravisGockel 即使reinterpret_cast&lt;int&gt;(x) 也是允许的。所以呢?这只是意味着reinterpret_cast 在某些情况下实际上并没有重新解释。那么,我们将其命名为maybe_reinterpret_cast 吗? ;-)
    • enum-to-int无法通过reinterpret_cast完成的原因与enum的底层类型无关。如果是enum Foo : uint64_t { bar, baz }reinterpret_cast&lt;int&gt; 还是不允许的。
    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2021-02-09
    • 2015-10-19
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多