「reinterpret_cast」を使用して「constexpr」変数を初期化できますか?

Susan Sarandon
リリース: 2024-11-13 07:14:02
オリジナル
455 人が閲覧しました

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

reinterpret_cast とコンパイラの互換性を使用した constexpr 変数の初期化

次のコード スニペットを考慮してください。

struct foo {
  static constexpr const void* ptr = reinterpret_cast<const void*>(0x1);
};
ログイン後にコピー

でコンパイルした場合g v4.9 では、このコードは正常にコンパイルされます。ただし、clang v3.4 はコンパイルに失敗し、次のエラーが発生します:

error: constexpr variable 'ptr' must be initialized by a constant expression
ログイン後にコピー

コンパイラーの正確性

C 11 ドラフト標準に従っています (セクション 5.19、段落 2) )、reinterpret_cast が含まれる場合、条件式は定数式とみなされません。したがって、ptr の初期化が無効であるという Clang の解釈は正しいです。

適切な宣言

この性質の定数式を適切に宣言するには、以下を使用する必要があります。代わりに intptr_t を使用し、必要に応じてキャストします:

static constexpr intptr_t ptr = 0x1;
ログイン後にコピー

また、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);
ログイン後にコピー

この式は両方のコンパイラで受け入れられます。 __builtin_constant_p チェックに追加します。これにより、式が定数折り畳まれます。

以上が「reinterpret_cast」を使用して「constexpr」変数を初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート