[英]How to convert between int * and enum *?
從一些 C 遺留代碼中,我得到了一些作為int *
的常量。 在 C++ 部分,我有一個底層類型 int 的枚舉。 基於單個值的枚舉和 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;
為什么?
從編譯器的角度來看int*
和E*
是不同的非相關類型的指針,這就是為什么static_cast
在這里不適用。
我如何將指向某些 int 值的指針轉換為指向 int 枚舉的指針,反之亦然?
您可以嘗試reinterpret_cast
而不是static_cast
:
f = reinterpret_cast<E *>(&i);
j = reinterpret_cast<int *>(&e);
任何指向類型 T1 的對象的指針都可以轉換為指向另一個類型 cv T2 的對象的指針
但是,請注意,取消引用f
或j
(即使用*f
或*j
)將違反嚴格的別名規則(有關更多詳細信息,請參閱下面的討論)。 這意味着這種轉換雖然嚴格可行,但通常沒有用。
枚舉的默認“基本類型”是int
並且可以在 OP 中明確指定。 從邏輯上講,存儲在E* e
中的值,其中 E 是基本類型為int
的枚舉,是一個int
。 它不能靜態轉換。
在 C++ 中不能保證基本類型的enum
(比如)與short
布局兼容,但即使語言在這一點上收緊,也可能存在類型兼容性問題/
一個問題是E*
到int*pi
會違反類型安全,因為pi
可用於在枚舉之外安靜地設置值。 類似地,如果整數值不在枚舉中,則int*
到E*
可能會違反類型安全。
但是請注意,標准明確指出,沒有什么可以排除枚舉在其定義的值集之外取值:
這組值用於定義枚舉類型的提升和轉換語義。 它不排除枚舉類型的表達式具有超出此范圍的值。
請參見此處: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf (參見第 156 頁的注釋 95 底部)
唯一可能(如果布局兼容性得到保證)有效的情況是E*
到const int*
因為E*
所有值都是int
並且不能(正確)通過int *
指針修改該值而不進一步違反類型系統。
但我認為語言定義並沒有那么微妙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.