константные указатели в контейнерах STL - PullRequest
3 голосов
/ 02 августа 2009

Здравствуйте, коллеги-программисты на C ++. У меня есть, как я надеюсь, быстрый вопрос о контейнерах STL:

std::list<std::string> l;

Этот оператор прекрасно компилируется, когда используется в некотором исходном файле C ++ (с соответствующими включениями). Но

std::list<const std::string> m;

или

std::list<std::string * const> n;

не скомпилируется при использовании gcc (gcc версии 4.0.1 (Apple Inc., сборка 5484)). Однако при использовании компилятора Visual Studio 2008 C ++ претензий не возникает.

Небольшое исследование обнаруживает, что элементы в контейнерах STL должны быть Assignable. Есть ли ошибка в STL в реализации VC (я бы сказал: «маловероятно») или они используют другую концепцию Assignable?

Ответы [ 3 ]

4 голосов
/ 02 августа 2009

Вещи в контейнере должны быть присваиваемыми (то есть не константными), но компилятору не нужно создавать экземпляры всех методов шаблона, если они не используются фактически, и в этот момент он может обнаружить проблему констант. Некоторые компиляторы делают это лучше, чем другие.

4 голосов
/ 02 августа 2009

Технически, элементы контейнера должны быть назначаемыми, однако в std::list узлы списка очень редко перемещаются, поэтому после создания их не нужно копировать (ОК) или назначать (может вызвать ошибку).

Если компилятор не попытается проверить назначаемость, вполне вероятно, что создание множества операций со списками на самом деле не приведет к ошибке компиляции, даже если это не технически допустимо.

2 голосов
/ 02 августа 2009

STL по своему дизайну обрабатывает типы данных, поддерживающие семантический тип значения (copy c-tor и operator =). Проблема заключается в const, из-за которого содержащиеся значения не поддерживают семантический тип значения.

Например:

std::list<const std::string> m;

терпит неудачу, так как вы не можете присвоить значение элементу списка.

...