Указатель C++ в константном объекте может вызывать неконстантную функциюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Указатель C++ в константном объекте может вызывать неконстантную функцию

Сообщение Anonymous »

У меня есть ситуация, когда объект const, имеющий член-указатель, может вызывать неконстантную функцию ниже:
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;
}
В строке 23 (

Код: Выделить всё

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
Я попробовал несколько разных компиляторов. GCC 14.2, 11.2, Кланг 19.1.0, MSVC 19.14. Тем не менее.
Может ли кто-нибудь помочь мне понять, почему прямой доступ к указателю из объекта const не предотвращает изменение его содержимого?

Подробнее здесь: https://stackoverflow.com/questions/792 ... t-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»