【问题标题】:const pointers in STL containersSTL 容器中的 const 指针
【发布时间】: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 的另一个概念?

【问题讨论】:

    标签: c++ stl const-correctness


    【解决方案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 在我的问题中使用一致的代码时不提供错误消息。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2011-07-08
    • 2011-01-10
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多