STL 容器中的 const 指针
Posted
技术标签:
【中文标题】STL 容器中的 const 指针【英文标题】:const pointers in STL containers 【发布时间】:2009-08-02 14:28:24 【问题描述】:各位 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
的另一个概念?
【问题讨论】:
【参考方案1】:从技术上讲,容器元素必须是可分配的,但是在std::list
中,列表节点很少移动,因此一旦构建它们就不需要复制(OK)或分配(会导致错误)。
除非编译器不遗余力地测试可分配性,否则实例化许多列表操作可能实际上不会导致编译错误,即使它在技术上不合法。
【讨论】:
我想使用多个编译器确实是值得的,学习曲线。但是,我宁愿有一个静态分析工具来指出这种棘手的任务。 您可能想查看 [STLport][stlport.org/]。我将不得不再次安装它,看看它是否能捕捉到这个。【参考方案2】:容器中的东西必须是可赋值的(即不是 const),但编译器不必实例化所有模板方法,除非它们被实际使用,此时它可以发现 const 问题。有些编译器比其他编译器更擅长这样做。
【讨论】:
+1,关键是“模板参数必须是可赋值的”是对程序的约束。如果不是,编译器不需要告诉你。【参考方案3】:STL 设计处理支持值类型语义的数据类型(复制 c-tor 和运算符 =)。问题是 const,它使包含的值不支持值类型语义。
例如:
std::list<const std::string> m;
失败,因为您无法为列表中的元素赋值。
【讨论】:
我想,我理解 const/Assignable 问题。但是,我想知道为什么 VS 在我的问题中使用一致的代码时不提供错误消息。以上是关于STL 容器中的 const 指针的主要内容,如果未能解决你的问题,请参考以下文章