【发布时间】:2018-01-22 08:33:24
【问题描述】:
从一些 C 遗留代码中,我得到了一些常量 int *。在 C++ 部分,我有一个基础类型 int 的枚举。基于单个值的枚举和 int 之间的转换有效。但是,int * 和 enum * 之间的转换是不可能的。请参阅下面的代码示例。
为什么会这样?如何将指向某些 int 值的指针转换为指向 int 枚举的指针,反之亦然?我有点希望它能够工作,因为单值转换工作并且基础类型是相同的。我阅读了有关 What happens if you static_cast invalid value to enum class? 的信息,但无法确定潜在的无效值是否在这里起作用。
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;
【问题讨论】:
-
你试过
reinterpret_cast吗? -
虽然您可以使用
reinterpret_cast进行转换,但这样做很少有用。如果不调用未定义的行为,则无法取消引用结果指针。 -
@davmac 似乎我应该确保关闭严格的别名规则或开始考虑复制。感谢答案和答案下面的讨论,我现在更好地理解了。