首頁 > 後端開發 > C++ > 為什麼初始化'constexpr”變數時'reinterpret_cast”會導致編譯錯誤?

為什麼初始化'constexpr”變數時'reinterpret_cast”會導致編譯錯誤?

Mary-Kate Olsen
發布: 2024-11-13 04:37:02
原創
830 人瀏覽過

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

constexpr 和reinterpret_cast:C 編譯出錯

考慮以下程式碼片段:

<preoo> static constexpr const void<br> ptr = reinterpret_cast<const void>>(0x1);};<br><br></const></preoo></preoo></p>這段程式碼在g v4.9 中編譯沒有錯誤,但在clang v3.4中失敗並出現錯誤:<p></p> <pre class="brush:php;toolbar:false">error: constexpr variable 'ptr' must be initialized by a constant expression
登入後複製
哪個編譯器是正確的?

依 C 11標準,clang正確。此標準規定常數表達式不得涉及reinterpret_cast。這意味著程式碼片段中 ptr 的初始化無效。

正確的初始化

聲明這種類型的表達式的正確方法是使用替代方法方法,如:

struct foo {<p> static constexpr intptr_t ptr = 0x1;<br>};<br></p>
登入後複製


這適用於 clang 和 g 。

GCC 的解決方法

雖然GCC 對原始程式碼片段的接受在技術上是不正確的,但它確實支援使用__builtin_constant_p 的解決方法宏:

struct foo {<p> static constexpr const void* ptr =<br><br></p>};<pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ?
  reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
登入後複製


此解決方法允許 GCC 折疊非常量表達式並將其視為常數。不過,它不是 C 標準的一部分,應謹慎使用。

以上是為什麼初始化'constexpr”變數時'reinterpret_cast”會導致編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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