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_type
的set<>::iterator
是const
.
当然,其原因在于对值的任何修改都可能使不变量无效std::set<>
.