constexpr 和使用重新解釋強制轉換靜態const Void 指標的初始化:編譯器差異
以下程式碼片段說明了該問題:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
以下程式碼片段說明了這個問題:
編譯器差異
error: constexpr variable 'ptr' must be initialized by a constant expression
雖然此程式碼在 g v4.9 中編譯成功,但在 clang v3.4 中編譯失敗。 Clang 產生錯誤:
標準合規性
依據 C 11 標準, constexpr 變數必須由常數表達式初始化。如 C 11 標準草案第 5.19 節第 2 段所述,Reinterpret_cast 不是常數表達式。因此,clang 拒絕代碼是正確的。
正確聲明
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
使用重新解釋強制轉換聲明 constexpr 變數的正確方法是使用 __builtin_constant_p 巨集。此宏允許非常量表達式的常數折疊。以下修改後的程式碼可以在 g 和 clang 中編譯:
此程式碼使用三元條件運算子來測試重新解釋的強制轉換表達式是否為常數表達式。如果 true,則執行強制轉換,否則評估失敗。以上是可以使用'reinterpret_cast”來初始化'constexpr”靜態 const void 指標嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!