从一些 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)
这是为什么?
从编译器的角度来看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)
任何指向类型 T1 的对象的指针都可以转换为指向另一个类型 cv T2 的对象的指针
但是,请注意,取消引用for j(即使用*for *j)将违反严格的别名规则(有关更多详细信息,请参阅下面的讨论)。这意味着这种转换虽然严格可行,但通常没有用。
| 归档时间: |
|
| 查看次数: |
2306 次 |
| 最近记录: |