为什么std::set.insert()返回一个非常量迭代器,而我却无法修改它

Why does std::set.insert() return a non-const iterator, and yet I cannot modify it?

本文关键字:迭代器 修改 一个 insert set std 返回 非常 为什么 常量      更新时间:2023-10-16

考虑以下代码示例:

#include <set>
#include <string>
using namespace std;
set<string> string_set;
void foo(const string& a)
{
    pair<set<string>::iterator, bool> insert_result = string_set.insert(a);
    string& val = *(insert_result.first);
    val += " - inserted";
}

因此,撇开正确性不谈,比如不检查是否成功插入等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010(禁止将迭代器解引用为非常量字符串(我们是从VS2005迁移过来的,它在没有警告的情况下处理这个问题(。

现在,我知道这应该被禁止,因为它可能会使字符串变得不唯一,我有点高兴它能以这种方式工作,但在现实世界中,它并没有那么清晰,因为我想修改一个不参与等价测试或排序的不可变数据成员。

我想知道的是,编译器如何知道我不被允许这样做,以及在没有参考文档的情况下我如何知道(文档中没有提到这一点(?

干杯,Guy

因为根据标准,通过不允许CCD_ 1。该标准特别允许CCD_ 2和CCD_相同类型。尽管不要求它们相同类型,它确实需要set<>::iteratorvalue_type为CCD_ 6。

当然,原因是对值可能使CCD_ 7的不变量失效。

来自标准:

23.3.3

集合是一种关联支持唯一密钥的容器(每个键最多包含一个值(,并提供快速检索钥匙本身。类集合支持双向迭代器。

这也是来自标准:
typedef实现定义迭代器;//见23.1

set::迭代器的实际实现是一个常量迭代器,以满足具有唯一键的要求。否则,您可以将集合中的值更改为所有相同的值。