首頁 > 後端開發 > C++ > 可以使用'reinterpret_cast”來初始化'constexpr”變數嗎?

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

Susan Sarandon
發布: 2024-11-13 07:14:02
原創
503 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板