ホームページ > バックエンド開発 > C++ > C で Constexpr 静的関数を使用して Constexpr 静的メンバーを正しく初期化するにはどうすればよいですか?

C で Constexpr 静的関数を使用して Constexpr 静的メンバーを正しく初期化するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-02 13:35:12
オリジナル
755 人が閲覧しました

How Can I Correctly Initialize a Constexpr Static Member Using a Constexpr Static Function in C  ?

constexpr 静的関数を使用した静的メンバーの初期化: ウォークスルー

はじめに

提示したシナリオには、 constexpr関数。残念ながら、特定のアプローチでこれを達成しようとすると、gcc のさまざまなバージョンで課題に直面しました。この記事では、これらの試みを分析し、エラーの根本的な理由を調査し、考えられる解決策や説明を提供します。

最初の試みとそのエラー

最初の試みには、constexpr 関数の両方の宣言が含まれていました。 foo と constexpr 静的メンバー bar をクラス本体内に追加しましたが、これによりコンパイル エラーが発生しました。これらは、関数呼び出しが定数式内に存在できないこと、および静的クラス メンバーが定数ではない初期化子を持つことができないことを示しています。

2 回目の試行とそのエラー

2 回目の試行では、宣言がクラス本体の外に移動されました。 , しかし、それでもエラーが発生しました。特に、エラー メッセージでは、静的データ メンバー bar には初期化子が必要であること、およびその constexpr としての宣言がクラス外での以前の宣言と矛盾していることが述べられています。

標準の分析

C 標準のセクション 9.4 .2 では、リテラル型の静的データ メンバーの宣言に constexpr 指定子を含めることができると規定されています。ただし、それらの初期化子は、brace-or-equal-initializer である必要があり、その中の代入式は定数式である必要があります。

どちらの試行でも、bar の宣言に Brace-or-equal がありませんでした。 -イニシャライザ。したがって、どちらも規格で定められた要件を満たしていません。

制限と解決策

ただし、この状況には規格によって課せられた固有の制限があります。これにより、クラスが完全なコンテキストで静的 constexpr データ メンバーを初期化することができなくなります。したがって、brace-or-equal-initializer ルールの使用は、非静的データ メンバーにのみ適用されます。

その結果、クラスの完了に依存する constexpr 関数を使用した静的 constexpr データ メンバーの初期化は不可能になります。 。この制限は、constexpr 変数がメンバー関数のコンテキストでコンパイル時の定数式として使用可能でなければならないという要件によるものと考えられます。したがって、変数初期化子は関数本体の前に完全に定義する必要がありますが、静的データ メンバーの初期化子はこのコンテキストで未定義の関数呼び出しを引き起こし、定数式の要件に違反します。

以上がC で Constexpr 静的関数を使用して Constexpr 静的メンバーを正しく初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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