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