https:// godbolt.org/z/b3avKzGej
Код: Выделить всё
#include
struct foo
{
void func(const int &n)
{ std::cout func(20); // This works!?
// t2.m_ptr = t1.m_ptr; // error: assignment of member 'test::m_ptr' in read-only object
return 0;
}
Код: Выделить всё
t2.m.func(2);Однако тремя строками ниже в том же объекте const, но осуществляется доступ к «указателю» вместо прямого объект-член, компилятор нормально вызывает неконстантную функцию.
Инкапсуляция данных серьезно пострадала, поскольку я мог напрямую обращаться к членам, но дело не в этом. Я уловил это в производственном коде и клянусь, это не моя вина, а просто пытаюсь понять, что происходит.
Затем, конечно, я протестировал добавление функции доступа, а затем все работает так, как ожидалось, поскольку вызов использует неявное this:
Код: Выделить всё
// Added to `test`:
foo *foo_me() {return m_ptr;}
// In main:
t2.foo_me()->func(20); // error: passing 'const test' as 'this' argument discards qualifiers
Может ли кто-нибудь помочь мне понять, почему прямой доступ к указателю из объекта const не предотвращает изменение его содержимого?
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-function
Мобильная версия