STL容器中的const指针

时间:2009-08-02 14:28:24

标签: c++ stl const-correctness

你好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. build 5484))时无法编译。 但是,使用Visual Studio 2008 C ++编译器时,不会出现任何抱怨。

一项小小的研究发现STL容器中的元素必须是Assignable。在VC实现中是否存在STL错误(我会说:“不太可能”)或者他们是否使用Assignable的另一个概念?

3 个答案:

答案 0 :(得分:4)

从技术上讲,容器元素必须是可分配的,但是在std::list中,列表节点很少被移动,所以一旦构造它们就不需要复制(OK)或分配(会导致错误) )。

除非编译器不顾一切地测试可分配性,否则实例化许多列表操作可能实际上不会导致编译错误,即使它在技术上不合法。

答案 1 :(得分:4)

容器中的东西必须是可分配的(即不是const),但编译器不必实例化所有模板方法,除非实际使用它们,此时它可以发现const问题。有些编译器比其他编译器更擅长这样做。

答案 2 :(得分:2)

STL by design处理支持值类型语义的数据类型(copy c-tor和operator =)。问题是const,它使得包含的值不支持值类型语义。

例如:

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

失败,因为您无法为列表中的元素赋值。