Скажем, у меня такой простой класс
class Foo
{
public:
void foo()const
{
str[5] = 'x';
obj->changeTheWorld();
x = 4;
y.get() = 5;
obj2->changeTheWorld();
}
private:
char *str; //some referenced data, not owned by Foo
ComplexObj *obj; //some referenced data, not owned by Foo
int &x; //references as well
//wrapped reference, but has a "T& get()const"
std::reference_wrapper<int> y;
//an occasionally useful pointer wrapper for complex memory cases
//but has a "T* get()const"
std::shared_ptr<ComplexObj> obj2;
};
Это справедливо, потому что в методе const его просто указатель сам становится const, а не данными, на которые он указывает. Однако во многих случаях это не то, что я хотел, и мне нужна ошибка компиляции, если метод const пытается изменить содержимое этих элементов (либо напрямую, либо путем вызова неконстантного метода для этого элемента).
Есть ли стандартное решение для этого?
Я думаю, что какой-то класс-оболочка должен быть в состоянии достичь этого, а также должен быть тем, что компилятор оптимизирует, хотя и не сел, чтобы попытаться создать такую вещь, чтобы охватить все случаи, сказав, что strong_const<char*> str
и strong_const<int&>
(также не уверен в хорошем имени...).