リテラルの reinterpret_cast は constexpr Static Const Void ポインターの初期化に有効ですか?

Linda Hamilton
リリース: 2024-11-13 03:32:02
オリジナル
730 人が閲覧しました

Is reinterpret_cast of a Literal Valid for Initializing a constexpr Static Const Void Pointer?

constexpr と再解釈キャストによる静的 Const Void ポインタの初期化: どのコンパイラが正しいですか?

問題の説明

次のコード スニペットを考えてみましょう。

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
ログイン後にコピー

質問

  1. 標準に従って正しいコンパイラはどれですか?
  2. 何そのようなことを宣言する適切な方法です式?

回答

  1. clang コンパイラは正しいです

C 11 標準セクション 5.19 によると (定数式)、条件式に関係する場合、条件式はコア定数式とみなされません。再解釈_キャスト。したがって、clang はこのコードにエラーとしてフラグを立てるのが正しいです。

  1. 適切な宣言

簡単な解決策は、代わりに 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート