ホームページ >バックエンド開発 >C++ >関数で static const int メンバーを使用すると、「\'Bar::kConst\' への未定義の参照」エラーが発生するのはなぜですか?

関数で static const int メンバーを使用すると、「\'Bar::kConst\' への未定義の参照」エラーが発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 19:29:03867ブラウズ

Why do I get an

Static const int への未定義の参照

質問:

次のコードを考えてみましょう:

<code class="cpp">class Bar {
public:
  static const int kConst = 1;
  void func() { foo(kConst); }
};

int main() { Bar b; b.func(); }</code>

このコードのコンパイル中に、「'Bar::kConst' への未定義の参照」というエラーが発生します。これはなぜ発生しますか?また、どのように解決できますか?

回答:

このエラーは、静的 const int メンバーが使用されている (関数またはキャストに渡される) ために発生します。 、名前空間スコープで定義する必要があります。

C 11 セクション 9.4.2/4 によると、

「静的データ メンバーが const 整数型または const 列挙型である場合、その宣言はクラス定義では、整数定数式である定数初期化子を指定できます。その場合、メンバーは、プログラム内で使用される場合でも、名前空間スコープ内で定義されます。 🎜>

静的データ メンバーを const 参照で渡すことは、C 11 セクション 3.2/2 に従って「使用」となります:

「... が sizeof 演算子のオペランドでない限り、式は潜在的に評価されます。 ... または typeid 演算子のオペランドであり、 ... は多態性クラス型の左辺値を指定しません。その名前が潜在的に評価される式に出現する場合、オブジェクトまたは非オーバーロード関数が使用されます。"

しかし、GCC は当初、静的 const メンバーを名前空間スコープ内で定義せずに const 参照によって渡すことを許可していました。 C 0x ドラフトでは、これは許可されなくなりました。

静的 const メンバーのような存在しないオブジェクトのアドレスまたは参照を取得するときに、実際的な問題が発生します。これにより、複数の翻訳単位から呼び出された場合に未定義の動作が発生する可能性があります。

この問題を解決するには、次の変更を行うことができます。

  • 静的 const メンバーを定義する名前空間スコープ内:

    <code class="cpp">int bar::kConst = 1;</code>
  • static_cast(kConst) を使用して、コンパイラに一時的な int オブジェクトを作成させ、そのオブジェクトへの参照を渡します:

    <code class="cpp">foo(static_cast<int>(kConst));</code>

以上が関数で static const int メンバーを使用すると、「\'Bar::kConst\' への未定義の参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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