constexpr 静的関数を使用して constexpr 静的メンバーを初期化する
このコードの目的は、次の名前空間に constexpr 値を作成することです。 constexpr 静的関数と静的メンバーを利用したクラス。ただし、これを達成しようとすると、さまざまなバージョンの g でコンパイル エラーが発生します。
First Attempt
class C1 { constexpr static int foo(int x) { return x + 1; } constexpr static int bar = foo(sizeof(int)); };
このコードは、g 4.5.3 および 4.6 では失敗します。 3 constexpr 静的メンバーに関数呼び出しが存在するため初期化。
2 回目の試行
class C2 { constexpr static int foo(int x) { return x + 1; } constexpr static int bar; }; constexpr int C2::bar = C2::foo(sizeof(int));
静的 constexpr データ メンバーの宣言に初期化子が必要なため、このコードは g 4.6.3 では失敗します。
スタンダードの要件
C 標準のセクション 9.4.2 に従って、リテラル型の静的データ メンバーは、constexpr 指定子を使用してクラス定義で宣言できます。その場合、宣言では中括弧またはイコール初期化子を指定する必要があります。ここで、すべての初期化句は定数式です。
「2 回目の試行」コードでは、宣言に中括弧または-がありません。等しいイニシャライザ。したがって、それは標準の要件を満たしていません。
目標の不可能性
残念ながら、標準では、クラスが存在するあらゆるコンテキストで静的 constexpr データ メンバーを初期化することができません。完了。これは、constexpr 変数がメンバー関数の本体内からコンパイル時の定数式として使用できる必要があるためです。したがって、変数初期化子は関数本体の前に完全に定義されます。これは、関数が初期化子のコンテキストではまだ不完全であることを意味します。その結果、式は定数式とは見なされません。
結論
C 標準の制限により、静的な constexpr データを初期化することはできません。クラスが完成したときに constexpr 静的関数を使用するメンバー。
以上がC で `constexpr` 静的関数を使用して `constexpr` 静的メンバーを初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。