【问题标题】:Acquiring the reference to an element of an STL container in a C++11 range-based 'for' loop在基于 C++11 范围的“for”循环中获取对 STL 容器元素的引用
【发布时间】:2012-04-29 00:06:09
【问题描述】:
for (Something something : setOfSomething)          // OK
for (Something const& something : setOfSomething)   // OK
for (Something& something : setOfSomething)         // ERROR

error: invalid initialization of reference of type 'Something&'
from expression of type 'const Something'

迭代器什么时候返回const Something?它应该返回Something&Something const&。由于基于范围的“for”循环被解释为that,所以我对正在发生的事情没有合理的解释。

编辑:我说的是unordered_set而不是set,很抱歉造成这种混乱。

【问题讨论】:

    标签: c++ stl reference for-loop iterator


    【解决方案1】:

    您不能改变 set 的成员,因为这可能违反 set 不变量。所以编译器限制你获取 const 引用或复制回来。

    【讨论】:

    • 如果我修改我的对象可以破坏什么样的不变量。它占用的内存位置和大小保持不变——这两个东西是set 应该控制的唯一东西。另外,如果我有自己的容器怎么办?为什么编译器会对我的容器施加这种限制?老实说,它看起来像一个肮脏的黑客。
    • 如果通过set 的比较更新部分对象,则set 中对象的顺序可能会发生变化。如果此问题发生在std::set 或其任何亲属(多、无序等)以外的容器上,那么您能否将细节和更多代码编辑到您的问题中?
    • 那是我的问题——那我是个白痴,但这不是编译器的事。此外,我还可以在旧式迭代器循环中对其进行修改。
    • @Haroogan:您不能在迭代器循环或任何其他方式中修改set 元素,除非您故意使用const_cast 调用未定义的行为。 set 元素(以及一般的有序关联键)始终是不可变的,以保持顺序。
    • @Haroogan:不再。我认为它在 C++03 中确实如此,但委员会准确地修复了它。如果您事先知道某些成员不会破坏set 的不变量,那么声明它mutable 并提供const 访问器。
    猜你喜欢
    • 2013-02-15
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多