constexpr 和使用reinterpret_cast 初始化靜態const void 指標:編譯器差異解釋
編譯器正確性
標準規定 constexpr變數(例如本例中的 static const void 指標)必須使用常數表達式進行初始化。然而,根據 C 11 標準,reinterpret_cast 表達式不被視為核心常數表達式。因此,clang 是正確的 報告此代碼的錯誤。
正確的聲明
要正確聲明static constexpr const void 指針,有幾個選項:使用intptr_t 取代: 使用intptr_t類型並在檢索值時將其轉換為 void 指針,如下所示:
static constexpr intptr_t ptr = 0x1; // ... reinterpret_cast<void*>(ptr);
GCC/clang 擴充: GCC 和 clang 支援使用 __builtin_constant_p的文檔很少的擴充:
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
這個兩個編譯器都會對表達式進行常數折疊。但請注意,此擴充不是標準的一部分,未來版本的編譯器可能不支援。
以上是使用reinterpret_cast 初始化靜態constexpr const void 指標是否合法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!