首頁 > 後端開發 > C++ > 使用reinterpret_cast 初始化靜態constexpr const void 指標是否合法?

使用reinterpret_cast 初始化靜態constexpr const void 指標是否合法?

Linda Hamilton
發布: 2024-11-12 03:35:01
原創
980 人瀏覽過

Is it legal to initialize a static constexpr const void pointer using reinterpret_cast?

constexpr 和使用reinterpret_cast 初始化靜態const void 指標:編譯器差異解釋

在給定的程式碼片段中,一個 constatstic cons void指標是使用reinterpret_cast 宣告的。此程式碼提出了一個問題,即根據標準和聲明此類表達式的正確方法,哪種編譯器解釋是正確的。

編譯器正確性

標準規定 constexpr變數(例如本例中的 static const void 指標)必須使用常數表達式進行初始化。然而,根據 C 11 標準,reinterpret_cast 表達式不被視為核心常數表達式。因此,

clang 是正確的 報告此代碼的錯誤。

正確的聲明

要正確聲明static constexpr const void 指針,有幾個選項:

  1. 使用intptr_t 取代: 使用intptr_t類型並在檢索值時將其轉換為 void 指針,如下所示:

    static constexpr intptr_t ptr = 0x1;
    // ...
    reinterpret_cast<void*>(ptr);
    登入後複製
  2. GCC/clang 擴充: 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 const void 指標是否合法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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