const 引数を使用した関数のオーバーロード: 実行できない理由
C では、関数をオーバーロードすると、同じ名前を持つ複数の関数が許可されます。クラス内で異なるパラメータ リストを共存させることができます。ただし、非ポインタ、非参照パラメータの定数のみに基づいて関数をオーバーロードすることはできません。
次のコード例を考えてみましょう。
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; // const function int foo(int); // non-const function }; 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; }
コードから明らかなように、引数の const に基づいて foo メソッドをオーバーロードしようとします。const 引数を受け入れる const バージョンと、非 const 引数を受け入れる非 const バージョンです。ただし、このコードでは、関数をオーバーロードできないことを示すコンパイル エラーが発生します。
このエラーは、C では非ポインター、非参照型の定数のみに基づくオーバーロードが許可されていないために発生します。その理由は、値引数を渡すときに、実際の引数が呼び出された関数内の一時変数にコピーされるためです。このコピーは元の引数とは異なり、その定数は元の引数の定数には影響しません。
したがって、上記の例では、obj.foo(3) を呼び出すと、リテラルの一時コピーが作成されます。 3 が作成され、const 関数に渡されます。同様に、obj.foo(variable) を呼び出すと、variable の一時コピーが作成され、非 const 関数に渡されます。コンパイラは、引数の定数だけに基づいてこれら 2 つのケースを区別できません。
要約すると、C では、非ポインタ、非参照型の定数に基づいて関数をオーバーロードすることは許可されません。これは、値引数の定数は関数内の引数の定数に影響せず、コンパイラは引数の型のみに基づいて 2 つを区別できないためです。
以上が非ポインター、非参照引数の定数だけに基づいて C 関数をオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。