为什么std :: set.insert()返回一个非const迭代器,但我无法修改它?

hat*_*cat 13 c++ iterator stl set visual-studio-2010

考虑以下代码示例:

#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";
}
Run Code Online (Sandbox Code Playgroud)

所以,除了正确性之外,例如不检查成功插入等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010)禁止将迭代器解除引用到非const字符串(我们'重新从VS2005迁移,在没有警告的情况下挥动它.

现在,我知道这应该被禁止,因为它可能使字符串不唯一,我很高兴它以这种方式工作,但在现实世界的情况下,它不是那么明确,因为我想修改不参与等效性测试或排序的不可变数据成员.

我想知道的是,编译器如何知道我不允许这样做,以及如何在不参考文档的情况下知道(无论如何都不提这个)?

干杯,盖伊

Jam*_*nze 25

因为根据标准,set<>::iterator不允许通过a 进行修改.该标准特别允许set<>::iterator并且set<>::const_iterator是相同的类型.虽然它并不要求它们是同一类型,但它需要value_typeset<>::iteratorconst.

当然,其原因在于对值的任何修改都可能使不变量无效std::set<>.