constexpr と再解釈キャストによる静的 const Void ポインターの初期化: コンパイラーの不一致
次のコード スニペットはこの問題を示しています。
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
コンパイラ不一致
このコードは g v4.9 では正常にコンパイルされますが、clang v3.4 ではコンパイルに失敗します。 Clang は次のエラーを生成します:
error: constexpr variable 'ptr' must be initialized by a constant expression
標準準拠
C 11 標準に従って、constexpr 変数は定数式で初期化する必要があります。 Reinterpret_cast は、C 11 標準草案のセクション 5.19 パラグラフ 2 に記載されているように、定数式ではありません。したがって、clang はコードを拒否するのが正しいことになります。
適切な宣言
再解釈キャストを使用して constexpr 変数を宣言する適切な方法は、__builtin_constant_p マクロを使用することです。このマクロにより、非定数式の定数の折りたたみが可能になります。次の変更されたコードは、g と Clang の両方でコンパイルされます。
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
このコードは、三項条件演算子を使用して、再解釈されたキャスト式が定数式であるかどうかをテストします。 true の場合、キャストが実行されます。それ以外の場合、評価は失敗します。
以上が「reinterpret_cast」を使用して「constexpr」静的 const void ポインタを初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。