ホームページ >バックエンド開発 >C++ >非ポインター、非参照引数の定数だけに基づいて C 関数をオーバーロードできないのはなぜですか?

非ポインター、非参照引数の定数だけに基づいて C 関数をオーバーロードできないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-11 21:25:03431ブラウズ

Why can't C   functions be overloaded based solely on the constness of a non-pointer, non-reference argument?

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 サイトの他の関連記事を参照してください。

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