Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::set.insert()返回一个非常量迭代器,但我无法修改它?_C++_Visual Studio 2010_Stl_Iterator_Set - Fatal编程技术网

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

C++ 为什么std::set.insert()返回一个非常量迭代器,但我无法修改它?,c++,visual-studio-2010,stl,iterator,set,C++,Visual Studio 2010,Stl,Iterator,Set,考虑以下代码示例: #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

考虑以下代码示例:

#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";
}
#包括
#包括
使用名称空间std;
设置字符串\u集;
void foo(常量字符串和a)
{
对插入结果=字符串集插入(a);
string&val=*(插入_result.first);
val+=“-插入”;
}
因此,撇开正确性不谈,比如不检查插入是否成功等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010)禁止将迭代器解引用到非常量字符串(我们从VS2005迁移,它在没有警告的情况下将其传递)

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

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

干杯, Guy

来自标准:

23.3.3

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

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


set::iterator的真正实现是一个常量迭代器,以保持对具有唯一键的需求。否则,您可以将集合中的值更改为所有相同的值。

因为根据标准,通过 不允许使用
set::iterator
。该标准明确规定: 允许
set::iterator
set::const_iterator
作为 同一类型。虽然这并不要求它们是一样的 类型,它确实需要
set::iterator
value\u type
来 be
const

当然,这样做的原因是对
值可能会使
std::set

的不变量无效。我认为它不会返回
const\u迭代器,我认为它是
第一个
成员,即const。@Michael标准说它是实现定义的。看见edit@Michael:对于
集合
,没有
第一个
,我想你把它和
地图
混淆了,它存储了
。Matthieu M.,对。因为我可能在某处见过基于地图的集合实现;-)