Я пытался обернуть что-то похожее на общие указатели данных Qt для своих целей, и после тестирования я узнал, что при вызове функции const вместо него выбирается неконстантная версия.
Я компилирую с параметрами С++ 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. И когда я комментирую неконстантный, он компилируется без ошибок, поэтому это возможно. Тем не менее мой терминал печатает:
"non const data ptr"
Является ли это ошибкой GCC (у меня есть 4.5.2), или что-то мне не хватает?