问题描述
|
我在一次演讲中听说C ++ 0x关联容器中的键不再可变。以前,在C ++ 03中,它们是可变的,只有Standard的文本说顺序或键必须保持不变。
现在,幸运的是,这是非法的:
std::set<int> ss { 2,5,1,6,8,2,4,9 };
auto it = ss.find(4);
*it = 7; // \'ERROR: assignment of read-only location\'
这种变化在C ++ 0x中体现在哪里?我看了定稿,但仍然看到find()
和这样的收益iterator
-听起来可以修改。 (这也是为什么我必须猜:为什么像map
这样的容器希望允许值beeing修改。为了使键部分为const,进行了哪些更改?)
解决方法
仅供参考,N3290中的23.2.4 / 5说:
对于
set
和multiset
值
type与键类型相同。对于
map
和multimap
等于
pair<const Key,T>
。按键
关联容器是不可变的。
和23.2.4 / 6说:
对于关联容器,
值类型与键相同
iterator
和
const_iterator
不变
迭代器。 ... 注意:
iterator
和const_iterator
有
在这种情况下相同的语义
这句话能解决您的问题吗?
,基本上,现在将iterator
和const_iterator
指定为相同。这当然是低级的,而不是技术性,但是对于set
容器在C ++ 0x中将iterator
键入为const_iterator
是完全合法的。
对于map
,那当然是was19ѭ,所以它从来没有问题。