首頁  >  文章  >  後端開發  >  可以使用“reinterpret_cast”來初始化“constexpr”變數嗎?

可以使用“reinterpret_cast”來初始化“constexpr”變數嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-13 07:14:02453瀏覽

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn