2009-08-02 3 views
3

Привет, коллеги программистов на С ++. у меня есть, что я надеюсь быть, быстрый вопрос о STL контейнерах:указатели константы в контейнерах STL

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

Это утверждение отлично компилируется при использовании в некоторых C++ SourceFile (с соответствующим включает в себя). Но

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?

ответ

4

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

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

+0

Я предполагаю, что он окупится, чтобы использовать несколько компиляторов, обучая кривой. Тем не менее, я бы предпочел, чтобы инструмент статического анализа указывал на такие скользкие назначения. – msi

+0

Возможно, вы захотите проверить [STLport] [http://www.stlport.org/]. Мне придется снова установить его и посмотреть, поймает ли он это. –

4

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

+1

+1, ключевым моментом является то, что «параметр шаблона должен быть назначаемым» является ограничением для программы. Требование от компилятора не является обязательным, если это не так. –

2

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

Например:

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

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

+0

Я думаю, я понимаю const/Assignable problem. Интересно, однако, почему VS не предоставляет сообщение об ошибке при использовании соответствующего кода в моем вопросе. – msi

Смежные вопросы