Const 引数による関数のオーバーロード
C では、関数のオーバーロードを使用して、同じ名前で引数の型が異なる複数の関数を定義できます。数字。ただし、引数の定数に基づくオーバーロードには制限があります。
指定されたコードを考えてみましょう:
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; int foo(int); }; int main() { Test obj; Test const obj1; int variable = 0; do { obj.foo(3); // Call the const function obj.foo(variable); // Attempt to call the non-const function variable++; usleep(2000000); } while (1); } int Test::foo(int a) { cout << "NON CONST" << std::endl; a++; return a; } int Test::foo(const int a) const { cout << "CONST" << std::endl; return a; }
このコードは、引数の定数に基づいて foo 関数をオーバーロードしようとします。ただし、コンパイラは、関数をオーバーロードできないことを示すエラーを生成します。
説明
C では、非ポインターの定数のみに基づいて関数をオーバーロードします。非参照型の引数は許可されません。これは、コンパイラが値によって渡される値の定数に基づいて 2 つの関数を区別できないためです。
指定されたコードでは、foo の両方のバージョンが値によって整数を受け取ります。引数が値によって渡される場合、変数のコピーが作成され、仮パラメータの定数はコピーの値に影響しません。
したがって、コンパイラは、どのバージョンの変数であるかを判断する方法がありません。値によって非定数整数が渡された場合に呼び出す foo。このあいまいさは、同じシグネチャを持つ関数に対するオーバーロードの禁止に違反します。
代替アプローチ
目的の動作を実現するには、代替アプローチを使用できます。 1 つのオプションは、以下に示すように、明示的な定数を持つ参照渡しを使用することです。
int foo(const int& a); int foo(int& a);
このアプローチでは、コンパイラは参照の定数に基づいて 2 つの関数を区別でき、適切な定数を可能にします。過負荷です。
以上がC 関数は、非ポインター、非参照引数の定数性にのみ基づいてオーバーロードできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。