如何在 int * 和 enum * 之间进行转换?

Tri*_*ion 6 c++ enums c++11

从一些 C 遗留代码中,我得到了许多常量作为int *. 在 C++ 部分,我有一个底层类型 int 的枚举。基于单个值的 enum 和 int 之间的转换有效。但是,int *和之间的转换enum *不能。请参阅下面的代码示例。

为什么会这样,我如何将指向某些 int 值的指针转换为指向 int 枚举的指针,反之亦然?我有点期望它能够工作,因为单值转换有效并且底层类型相同。我读到如果你 static_cast 无效值到枚举类会发生什么? 但无法确定潜在的无效值是否在这里起作用。

int i = 3;
enum E : int;
E e;

e = static_cast<E>(i);   // ok
i = static_cast<int>(e); // ok

int *j;
E * f;

j = static_cast<int *>(&i); // ok
f = static_cast<E *>(&i);   // 'static_cast': cannot convert from 'int *' to 'E *'
j = static_cast<int *>(&e); // 'static_cast': cannot convert from 'E *' to 'int *'

// now use j and f
*j = *f;
Run Code Online (Sandbox Code Playgroud)

Edg*_*jān 6

这是为什么?

从编译器的角度来看int*E*它们是不同非相关类型的指针,这就是为什么static_cast在这里不适用。

我如何将指向某些 int 值的指针转换为指向 int 枚举的指针,反之亦然?

您可以尝试reinterpret_cast代替static_cast

f = reinterpret_cast<E *>(&i);
j = reinterpret_cast<int *>(&e);
Run Code Online (Sandbox Code Playgroud)

来自reinterpret_cast

任何指向类型 T1 的对象的指针都可以转换为指向另一个类型 cv T2 的对象的指针

但是,请注意,取消引用for j(即使用*for *j)将违反严格的别名规则(有关更多详细信息,请参阅下面的讨论)。这意味着这种转换虽然严格可行,但通常没有用。

  • 值得注意的是,虽然这“有效”,但很可能是严格的别名违规。 (3认同)
  • @user2079303 它 100% 是严格的别名违规,这是证明:https://godbolt.org/g/pekQNX(参见 `add eax, eax`。假设两个指针不能别名) (2认同)