Вопрос по pass-by-const-reference, c++ – c ++ передача по константной ссылке
В следующей программе тело состоит из вектора указателей. Точки - это структура координат x, y, z и point_id. Я полагаю, что поскольку тело передается по константной ссылке, следующий шаг должен привести к ошибке. Но программа работает без проблем. Не могли бы вы объяснить, почему это так?
void readOutFile(const Body& body, int n){
....
body.bp[0]->points.push_back(Point_id(p,i));
}
body
передается какconst
но компилятор не может знать, чтоbody.bp[0]->points
должно бытьconst
также.
wroniasty
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)
Да,body
постоянно. Это означает, что никакие неконстантные функции-члены не могут быть вызваны, и никакие переменные-члены не могут быть изменены.
Ни то, ни другое не делается. Единственный членbody
используетсяbody.bp[0]
, который также не изменяется, а просто используется дляpoints
, который может или не может быть постоянным ...
Corrolary: не делайте членов данных публичными.