Qtの共有データポインタに似たものを私の目的のためにラップしようとしましたが、テストの結果、const関数を呼び出す必要があるとき、代わりに選ばれた。非constバージョンではなくconst関数を呼び出す
私はC++ 0xのオプションでコンパイルすると、ここに最小限のコードですよ:あなたが見ることができるように
struct Data {
int x() const {
return 1;
}
};
template <class T>
struct container
{
container() {
ptr = new T();
}
T & operator*() {
puts("non const data ptr");
return *ptr;
}
T * operator->() {
puts("non const data ptr");
return ptr;
}
const T & operator*() const {
puts("const data ptr");
return *ptr;
}
const T * operator->() const {
puts("const data ptr");
return ptr;
}
T* ptr;
};
typedef container<Data> testType;
void testing() {
testType test;
test->x();
}
、Data.xはconstの関数であるので、オペレータ - >と呼ばれはする必要がありますコンスタント。非constのものをコメントアウトすると、エラーなしでコンパイルされるので、可能です。しかし、私の端末版画:
"非constのデータPTR"
それはGCCのバグ(私は4.5.2を持っている)か、それとも私が欠けている何かがあるのでしょうか?
したがって、constオーバーロードを呼び出すことができたとしても、オブジェクトがconst宣言されていない場合、コンパイラは非constオーバーロードを呼び出すことを好みますか? – coyotte508
@ coyotte508:正確に。 nonconst'オーバーロードはより良い一致とみなされます。 –