Подтвердить что ты не робот

С++ передача по ссылке const

В следующем программном теле косификаторы вектора указателей. Точки - это структура координат x, y, z и point_id. Я считаю, что тело передается ссылкой const, следующий шаг должен приводить к ошибке. BUt программа работает без проблем. Не могли бы вы объяснить мне, почему это.

void readOutFile(const Body& body, int n){

    ....

    body.bp[0]->points.push_back(Point_id(p,i));
}
4b9b3361

Ответ 1

Здесь проблема:

body.bp[0]->points.push_back(Point_id(p,i));
          ^^

Направление указателя удаляет любую константу; скорее, константа результата зависит от типа указателя.

T *t;              // pointer to T: can modify t and (*t)
const T *t;        // pointer to const-T: can modify t but not (*t)
T *const t;        // const-pointer to T: can modify (*t) but not t
const T *const t;  // const-pointer to const-T: can't modify either t or (*t)

Ответ 2

Это один из лучших примеров, который показывает, почему data members should not be public.

здесь, body является постоянным, поэтому его члены данных не должны меняться, но в body.bp[0]->points изменяется точка, которая не является членом body. Не имеет значения const const.

Ответ 3

Только body является константой.

body.bp[0]->points не зависит от постоянной body

Ответ 4

Да, body является постоянным. Это означает, что не могут быть вызваны не константные функции-члены, и никакие переменные-члены не будут изменены.

Ничего не делается. Единственным членом body является body.bp[0], который тоже не изменен, а просто используется для доступа к points, который может быть или не быть постоянным...

Corrolary: не публиковать данные.