constexpr と reinterpret_cast: C コンパイルのエラー
次のコード スニペットを考えてみましょう:
<br>struct foo {<br> static constexpr const void<em> ptr = reinterpret_cast<const void</em>>(0x1);<br>};<br>
このコードは、g v4.9 ではエラーなしでコンパイルされます。しかし、clang v3.4 では失敗します。 error:
どのコンパイラが正しいですか?
C 11 標準によれば、clang が正しいです。標準では、定数式に reinterpret_cast を含めてはならないと規定されています。これは、コード スニペット内の ptr の初期化が無効であることを意味します。
適切な初期化
このタイプの式を宣言する適切な方法は、代替メソッドを使用することです。メソッド (例:
<br>struct foo {<br> static) constexpr intptr_t ptr = 0x1;<br>};<br>
これは、clang と g の両方で機能します。
GCC の回避策
GCC は元のコード スニペットを受け入れますが、技術的には正しくありませんが、__builtin_constant_p マクロを使用した回避策がサポートされています:
<br>struct foo {<br> static constexpr const void* ptr =</p> <p>};<br>
この回避策により、GCC は非定数式を折りたたんで定数として扱うことができます。ただし、これは C 標準の一部ではないため、注意して使用する必要があります。
以上が「constexpr」変数を初期化するときに「reinterpret_cast」によってコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。