ホームページ > バックエンド開発 > C++ > 非ポインタ、非参照型の「const」修飾子に基づいて関数をオーバーロードできないのはなぜですか?

非ポインタ、非参照型の「const」修飾子に基づいて関数をオーバーロードできないのはなぜですか?

Patricia Arquette
リリース: 2024-11-19 18:18:02
オリジナル
731 人が閲覧しました

Why Can't We Overload Functions Based on the `const` Qualifier for Non-Pointer, Non-Reference Types?

const 引数を持つ関数とオーバーロードを理解する

プログラミングでは、オーバーロードを使用すると、同じ名前でパラメーターが異なる複数の関数を同じ関数内に共存させることができます。クラス。ただし、非ポインター型、非参照型の定数に基づいてオーバーロードしようとすると、コンパイラ エラーが発生します。この記事では、この制限の背後にある理由と代替アプローチについて説明します。

次のコード部分を考えてみましょう:

class Test {
public:
    Test() {}
    int foo(const int) const;
    int foo(int);
};
ログイン後にコピー

このコードをコンパイルすると、コンパイラは関数 foo が使用できないことを示すエラーを発行します。過負荷になる。これは、非ポインター、非参照型の定数が関数のシグネチャに影響を与えないためです。上記の例では、両方の関数のシグネチャは同じです: int foo(int).

この制限が存在する理由を理解するには、次の状況を考慮してください。

Test obj;
int variable = 0;
obj.foo(3);  // Calls the const function
obj.foo(variable);  // Intends to call the non-const function
ログイン後にコピー

ベースでオーバーロードが許可されている場合const の場合、コンパイラは obj.foo(variable) が呼び出されたときにどの関数を呼び出すかを決定できません。これは、値渡しの場合、値がコピーされ、const 指定は関数呼び出しとは無関係であるためです。

したがって、非ポインター、非参照型の定数に基づくオーバーロードは許可されません。 C で。別の方法として、異なる名前を持つ 2 つの別個の関数を作成することもできます。たとえば、

class Test {
public:
    Test() {}
    int fooConst(const int);
    int fooNonConst(int);
};
ログイン後にコピー

以上が非ポインタ、非参照型の「const」修飾子に基づいて関数をオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート