Взялся я за создание смартпоинтера, реализующего copy-on-write и в процессе наткнулся на непонятные для себя грабли. Почему-то компилятор совершенно игнорирует наличие константного перегруженного оператора разыменования, в результате чего рушится вся концепция копирования при записи. Приведу пример максимально упрощенного кода, показывающего проблему:
#include <iostream>
class A {
public:
A(int value) : _value(value) { }
const int &operator *() const
{
std::cout << "const int &A::operator *() const" << std::endl;
return _value;
}
int &operator *()
{
std::cout << "int &A::operator *()" << std::endl;
return _value;
}
private:
int _value;
};
int main()
{
A a = 10;
int v = *a;
return 0;
}
При запуске программа выводит "int &A::operator *()", а должна на мой взгляд выводить "const int &A::operator *() const". Подскажите, где моя ошибка? Я даже пробовал сделать
int v = const_cast<const int &>(*a);
но безрезультатно.