ホームページ >バックエンド開発 >C++ >「constexpr」変数を初期化するときに「reinterpret_cast」によってコンパイル エラーが発生するのはなぜですか?

「constexpr」変数を初期化するときに「reinterpret_cast」によってコンパイル エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-13 04:37:02830ブラウズ

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。