constexpr と reinterpret_cast による静的 const void ポインターの初期化: コンパイラーの違いの説明
指定されたコード スニペットでは、静的 constexpr const voidポインタは reinterpret_cast を使用して宣言されます。このコードは、標準に従ってどのコンパイラ解釈が正しいのか、またそのような式を宣言する適切な方法について疑問を引き起こします。
コンパイラの正当性
標準では、constexpr が次のように規定されています。この場合の static const void ポインターなどの変数は、定数式で初期化する必要があります。ただし、reinterpret_cast 式は、C 11 標準に従ってコア定数式とはみなされません。したがって、このコードのエラーを報告する場合、clang は正しいです。
適切な宣言
静的 constexpr const void ポインターを正しく宣言するには、次の手順を実行します。いくつかありますオプション:
代わりに intptr_t を使用します: 次のように、値を取得するときに intptr_t 型を使用して void ポインターにキャストします。
GCC/clang拡張機能: GCC と Clang は、__builtin_constant_p:
を使用した、ほとんど文書化されていない拡張機能をサポートしています。この式は、両方のコンパイラによって定数折り畳まれます。ただし、この拡張機能は標準の一部ではないため、コンパイラの将来のバージョンではサポートされなくなる可能性があることに注意してください。
以上がreinterpret_cast を使用して静的 constexpr const void ポインターを初期化することは合法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。