考慮以下程式碼片段:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; }
此程式碼在g v4.9 中編譯成功,但在clang v3.4 中編譯失敗,生成錯誤:
error: constexpr variable 'ptr' must be initialized by a constant expression
依C 11標準第5.19節(常數表達式),條件表達式在涉及reinterpret_cast時不被視為核心常數表達式。因此,clang 將此程式碼標記為錯誤是正確的。
一個簡單的解決方案是使用intptr_t 代替並強制轉換為void* 需要時:
static constexpr intptr_t ptr = 0x1; reinterpret_cast<void*>(foo::ptr);
但是,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靜態常數空指標有效嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!