14

同じパラメータリストで演算子を2回オーバーロードします。ただし、返品タイプは異なります。

T& operator()(par_list){blablabla}    
const T& operator()(par_list){blablabla}

では、()演算子を呼び出すとき、どの関数がどのような好みや状況に基づいて呼び出されるでしょうか?const関数の下で()を呼び出す場合、それはconst T&のものでなければならないことを私は知っています。

C ++がこのような状況にどのように対処し、デフォルトの設定がどのように機能するのか興味があります。

ありがとう

4

3 に答える 3

26

これらの関数は互いにオーバーロードしません。それらは同じシグネチャを持っているため、同じ関数を再定義しようとするとエラーになります。戻り値の型は、関数のシグネチャの一部ではありません。const関数をオーバーロードするには、同じ名前でパラメーターまたは/volatile修飾子が異なる 2 番目の関数を宣言する必要があります。つまり、戻り値の型ではなく、関数の修飾子です。

(それらは互いにオーバーライドしません。オーバーライドは、派生クラスが基本クラスの仮想関数に対して行うことです)。

メンバー関数のaconstおよび非オーバーロードを定義するのが一般的です。constオーバーロードは、戻り値の型だけでなくconst、関数を宣言する必要があります。const

T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}
                              ^^^^^

()これで、非constオブジェクトに適用した場合に最初のメソッドが呼び出され、オブジェクトに適用した場合に 2 番目のメソッドが呼び出されconstます。例えば:

Thingy nc;
Thingy const c;

nc(); // calls the first (non-const) overload
c();  // calls the second (const) overload
于 2012-10-03T01:21:09.333 に答える
3

戻り値の型に基づいて関数/メソッドをオーバーロードすることはできません。ここでコンパイラがエラーをスローすることを期待しています。できることは、メソッド自体をメソッドとして指定することですconst

const T& operator()(par_list) const {blahblah}

修飾子は、これをレシーバーでconst呼び出すことができることを意味するだけでなく、オーバーロードの解決にも使用されます。これは、メソッドに渡されるconst暗黙的なパラメーターに影響するために発生します。メソッドは で修飾子を使用し*this、オーバーロードの解決中に修飾子が考慮されます。constconst*thisconst

于 2012-10-03T01:20:29.993 に答える
1

演算子を定義する方法では、コンパイラがどの operator() を呼び出すかを決定する方法はありません。関数 (および演算子) のオーバーロードは、引数の型に対してのみ実行でき、戻り値の型に対しては実行できません。実際、2 番目のものを定義するとすぐに、コンパイル時にエラーが発生します。コンパイラは、同じ関数/演算子を再定義していると見なします。

ただし、以下は一般的です(おそらくあなたが持っているもの):

T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}

引数リストの後にこの追加の "const" が存在するのは、非静的メンバー関数を定義しており、メンバー関数には暗黙的な隠し引数 (クラスのインスタンスへの "this" ポインター) があるためです。そこにある「const」キーワードは、この隠しポインターが const インスタンスを指しているかどうかを示します。この引数は、オーバーロードの解決に参加します。この場合、使用する演算子のバージョンを選択するためにコンパイラが使用するものです。

そう:

class A {
    T& operator()() { ... }
    const T& operator()() const { .... }
};

A a;
const A& ca(a);
a(); -> returns a T&
ca(); -> returns a const T&
于 2012-10-03T01:44:52.223 に答える