3

你好 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

4

3 回答 3

4

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

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

于 2009-08-02T14:33:49.450 回答
4

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

于 2009-08-02T14:35:17.513 回答
2

STL 通过设计处理支持值类型语义的数据类型(复制 c-tor 和运算符 =)。问题是 const,这使得包含的值不支持值类型语义。

例如:

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

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

于 2009-08-02T14:36:42.923 回答