は、次のコードを検討:const参照の戻り値を持つオーバーロードされたメソッドが呼び出されないのはなぜですか?
#include <iostream>
using namespace std;
class A {
private:
int x;
public:
int& get_ref() {
cerr << "non const" << endl;
return x;
}
const int& get_ref() const {
cerr << "const" << endl;
return x;
}
};
int main() {
A a;
a.get_ref() = 10;
cout << a.get_ref() << endl;
const int& y = a.get_ref();
return 0;
}
Iはget_ref()
方法(および標準誤差で出力const
)の第2のバージョンを実行するa.get_ref()
に第二及び第三の呼び出しを期待します。しかし、常に最初のバージョンが呼び出されたように見えます。 2つの異なるゲッターを実装し、適切なバージョンがコンテキストに基づいて呼び出されることを確認するにはどうすればよいですか?少なくとも3回目の呼び出しの場合
const int& y = a.get_ref();
2番目のバージョンは実行されますか。 (非エレガントな解決策は、例えばget_ref
とget_const_ref
という異なる名前を使用することですが、回避できるかどうかを確認しようとしています)。
感謝を!したがって、特に、これは、クラス内からの 'get_ref'への呼び出しが、(' const'にあなたが提案したものと同様に 'this'をキャストしない限り)最初の(非const)バージョンに解決されることを意味します。私は正しい? – PBM
@PBMもっと正確に言えば、クラスのメンバ関数から 'get_ref'を呼び出すとき、解像度は' this'が 'const'または' non-const'を指しているかどうか、つまり最初に呼び出されるメンバ関数は 'const'です。か否か。つまり、 'const'メンバ関数の中で、' get_ref'を呼び出すと、constの 'get_ref'が呼び出されます。非constメンバ関数の中では、非constの 'get_ref'が呼び出されます。 – songyuanyao