静的 Const Int への未定義の参照: コンパイラの動作を理解する
への参照を受け入れるテンプレート関数 foo を定義するシナリオを考えてみましょう。型 T の定数。クラス Bar 内で、静的定数整数 kConst を宣言します。 kConst を引数として foo を呼び出すと、コンパイラは「'Bar::kConst' への未定義の参照」エラーを報告する場合があります。
このエラーは、静的 const 整数がコンパイル時に初期化されているにもかかわらず、依然として次の値を必要とするために発生します。特定の方法で使用される場合は、プログラム内の定義。 C 標準 (9.4.2/4) によれば、 const 静的データ メンバーは、整数定数式の場合、そのクラス定義で初期化できます。ただし、その宣言だけでは、const 参照や整数定数式で使用するには十分ではありません。
kConst を const 参照によって foo に渡す場合、事実上標準 (3.2/2) に従って「使用」していることになります。 。 GCC は静的データ メンバーが「使用されている」と見なすため、プログラムのスコープ内でのその実装を要求します。ただし、左辺値から右辺値への変換が即座に行われる値渡しの場合には寛大な対応が可能です。
さらに、存在しないオブジェクトのアドレスを取得したり、存在しないオブジェクトを参照したりすることは、一般的に推奨されません。静的データ メンバーは一意のメモリ位置に存在し、そのアドレスを複数の変換単位から渡すと、オブジェクトが 1 つの TU で明示的に定義されていない限り、未定義の動作が発生する可能性があります。
要約すると、コンパイラ エラーは、次の要件が原因で発生します。静的 const 整数が const 参照によって渡されるか、定数式で使用される場合の定義。このようなエラーを回避するには、標準のガイドラインに従うことが不可欠です。
以上がConst 参照によって静的 Const 整数をテンプレート関数に渡すと、「未定義の参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。