ホームページ >バックエンド開発 >C++ >「reinterpret_cast」を使用して「constexpr」静的 const void ポインタを初期化できますか?

「reinterpret_cast」を使用して「constexpr」静的 const void ポインタを初期化できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 03:19:101031ブラウズ

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。