ホームページ  >  記事  >  バックエンド開発  >  C 関数は、非ポインター、非参照引数の定数性にのみ基づいてオーバーロードできますか?

C 関数は、非ポインター、非参照引数の定数性にのみ基づいてオーバーロードできますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-11 19:35:03216ブラウズ

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

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