你好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
的另一个概念?
答案 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;
失败,因为您无法为列表中的元素赋值。