c ++ передача по константной ссылке

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

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

    ....

    body.bp[0]->points.push_back(Point_id(p,i));
}
 wroniasty11 июн. 2012 г., 10:34
body передается какconst но компилятор не может знать, чтоbody.bp[0]->points должно бытьconst также.
 ctrl-alt-delor15 июн. 2012 г., 10:38
Глубокая и неглубокая константа, как глубокая и неглубокая копия. Мелкий относится только к объекту. Глубокий относится к объекту и ко всем объектам, к которым он относится. И.Е. Неглубокая константная коллекция / объект - это инвариантная коллекция / объект вариантных объектов. Глубокая константная коллекция / объект является инвариантной коллекцией / объектом глубоких константных объектов. (обратите внимание на рекурсивное определение). Также обратите внимание, что если объект имеет глубокий констант, он прошел бы неглубокий тест констант. (это не относится к копии)
 zinking15 июн. 2012 г., 05:40
@Richard Что значит "const"? есть ли понятие: неглубокий и глубокий конст?
 ctrl-alt-delor11 июн. 2012 г., 12:27
В C ++ const неглубокий, а не глубокий. Так что это влияет на объект, но не на его ассоциации. Это означает, что вы можете вызывать только методы const. Но методы const могут изменять другие объекты, всегда использовать методы в интерфейсе и использовать хороший инструмент lint для проверки глубокого const.
 ctrl-alt-delor11 июн. 2012 г., 12:24
Он будет работать нормально, и ошибка const будет ошибкой времени компиляции, а не ошибкой времени выполнения.

Ответы на вопрос(4)

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)
 11 июн. 2012 г., 10:38
Я никогда не осознавал этого, но это имеет смысл. Constness распространяется и на указатель на член, но не на его содержимое.

data members should not be public.

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

 11 июн. 2012 г., 14:06
Для меня это пример того, почемуmember pointers не должно быть публичным. Нет ничего плохого в общедоступной & quot; стоимости & quot; члены данных.

body постоянно.

body.bp[0]->points никак не зависит отconstantness изbody

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

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

Corrolary: не делайте членов данных публичными.

Ваш ответ на вопрос