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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-13 04:37:02831瀏覽

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

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