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 指针的主要内容,如果未能解决你的问题,请参考以下文章

对容器中项目的 const-correct 指针访问

条款3:尽可能使用const

STL 迭代器 iterator const

STL概念

用类指针替换 STL List 容器

容器(vector)和指针(ptr)的区别