ホームページ >バックエンド開発 >C++ >C で静的 Const Int を参照渡しすると「未定義の参照」エラーが発生するのはなぜですか?

C で静的 Const Int を参照渡しすると「未定義の参照」エラーが発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 19:02:02771ブラウズ

Why Does Passing a Static Const Int by Reference Cause an

静的 Const Int への未定義の参照: 解決策

最近のプログラミング シナリオで、「未定義の静的 Const Int への参照」というメッセージとともにコンパイル エラーが発生しました。 'Bar::kConst'"。このエラーは次のコード スニペットから発生しました:

class Bar
{
public:
   static const int kConst = 1;
   void func()
   {
      foo(kConst);           // Error-prone line
   }
};

静的定数メンバー "kConst" が定義されていないためにエラーが発生しました。通常、コンパイラはコンパイル時に必要な置換を行うことが期待されます。ただし、この場合、関数「foo」は「const int &」パラメータを取るため、コンパイラは置換よりも参照を優先します。

この問題を解決するには、次の変更を使用できます。

foo(static_cast<int>(kConst));

このアプローチでは、コンパイラに一時的な "int" を作成させて、そこへの参照を渡すようにし、コンパイルを成功させます。

観察される動作は、C 標準で指定されているように、意図的なものです ( 9.4.2/4) では、定数整数型の静的データ メンバーに定数初期化子がある場合、それを整数定数式に使用できることが記載されています。ただし、プログラムで使用する場合は、名前空間スコープで定義する必要があります。

指定されたコードでは、静的データ メンバーを定数参照で渡すことは、C 標準 (3.2/2) に従って「使用」となります。これは、コンパイラが "kConst" の定義の存在を強制する義務があることを意味します。

特定のシナリオでは GCC がこの要件を見落とすことがありますが、一般的には標準を遵守し、参照の使用を控えることをお勧めします。存在しないオブジェクトに送信したり、存在しないオブジェクトのアドレスを取得したりします。

以上がC で静的 Const Int を参照渡しすると「未定義の参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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