Контейнеры, поддерживающие распределитель , такие как std::list
, не могут принимать const
типы значений, потому что Распределитель требования определяют поведение только для cv-неквалифицированные типы. Это означает, что контейнеру не гарантируется возможность создания объектов элементов через интерфейс распределителя, если тип значения квалифицирован как const
или volatile
.
Это не проблема, поскольку контейнер Быть const
достаточно, чтобы гарантировать, что элементы не изменены. Если вы обращаетесь к элементу контейнера через ссылку const
на контейнер, вы всегда получите только ссылку const
на элемент.
Итак, просто используйте const std::list<Person>
вместо const std::list<const Person>
.
Технически кто-то мог бы const_cast
const
отойти от такой ссылки, чтобы иметь возможность изменять элементы, и это, вероятно, было бы допустимым, то есть не неопределенным поведением, но это то, что пользователь всегда можно сделать, только если это приведет к неопределенному поведению с const
объектами.
См. также Разрешает ли C ++ 11 вектор ? для деталей.