次のコード スニペットを考えてみましょう。
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; }
このコードは g で正常にコンパイルされます。 v4.9 ですが、clang v3.4 では失敗し、次のエラーが生成されます:
error: constexpr variable 'ptr' must be initialized by a constant expression
C 11 標準セクション 5.19 によると (定数式)、条件式に関係する場合、条件式はコア定数式とみなされません。再解釈_キャスト。したがって、clang はこのコードにエラーとしてフラグを立てるのが正しいです。
簡単な解決策は、代わりに intptr_t を使用して、次のようにキャストすることです。必要な場合は void*:
static constexpr intptr_t ptr = 0x1; reinterpret_cast<void*>(foo::ptr);
ただし、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);
以上がリテラルの reinterpret_cast は constexpr Static Const Void ポインターの初期化に有効ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。