使用reinterpret_cast 和編譯器相容性進行constexpr 變數初始化
考慮以下程式碼片段:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
當🎜>當🎜>當使用g v4.9,此程式碼編譯成功。但是,clang v3.4 無法編譯,並發出錯誤:
error: constexpr variable 'ptr' must be initialized by a constant expression
編譯器正確性
根據C 11 草案標準(第5.19 節,第2段) ),如果條件表達式涉及reinterpret_cast,則不將其視為常數表達式。因此,clang 的解釋是正確的,即 ptr 的初始化無效。
正確聲明
要正確聲明這種性質的常數表達式,應該使用intptr_t 改為intptr_t 並在必要時強制轉換:
static constexpr intptr_t ptr = 0x1;
或者,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);
由於 __builtin_constant_p 檢查,兩個編譯器都接受該表達式,這會強製表達式進行常數折疊。
以上是可以使用“reinterpret_cast”來初始化“constexpr”變數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!