取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错

Posted

技术标签:

【中文标题】取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错【英文标题】:Error binding 'string&' to 'const string' when dereferencing a set iterator 【发布时间】:2017-12-01 14:48:35 【问题描述】:

我正在使用 C++11 和 STL。我有这段代码:

std::set<std::string>::iterator it;
[...]
std::string &str = *it;

编译器抛出此错误:

错误:类型‘std::__cxx11::string& aka std::__cxx11::basic_string&’到‘const std::__cxx11::basic_string’的绑定引用丢弃了限定符

为什么会这样?

【问题讨论】:

set 只有const_iterators。删除它,然后插入一个新元素 C++ STL set update is tedious: I can't change an element in place的可能重复 或者如果您不想更改值,只需在std::string 之前添加const 如果它实际上是const_iterator,为什么要定义迭代器?是的,我需要修改它。我找不到这个帖子。对不起 你不能修改std::set中的元素;那会打乱系列的秩序。如果您需要更改它,则必须将其删除并插入一个新的。 【参考方案1】:

set 或 map 中的键是 const。如果不是,则该集合将无法保证元素在键上是弱排序的。即当用户改变键时,它会变得莫名其妙地未排序。

std::set 迭代器取消对键的引用。键是(重申)常量。

可变引用不能绑定到 const 引用(语言强加的规则)。

因此,要么:

std::string const& str = *it;   // refer to the key

std::string str = *it;          // take a copy of the key

【讨论】:

好吧,但是如果它实际上是一个 const_iterator,为什么 C++ 定义迭代器呢? @class_OpenGL:这样就很容易迭代数据。 iterator 本身并不意味着可变性 啊,好吧。谢谢!! 或者更具体地说,std::set&lt;T&gt;::iteratorstd::set&lt;T&gt;::const_iterator 都存在以匹配所有其他容器模板的结构,它们相同。同样std::set&lt;T&gt;::key_typestd::set&lt;T&gt;::value_type相同,std::set&lt;T&gt;::key_comparestd::set&lt;T&gt;::value_compare相同

以上是关于取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错的主要内容,如果未能解决你的问题,请参考以下文章

完成 GeneratorDataset 迭代器时发生错误:已取消:操作已取消

迭代器未按预期运行

AngularJS:将布尔值绑定到单选按钮,以便在取消选中事件时将模型更新为 false

如何取消引用 Gradle 出版物的集合?

为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]

更改使用模块调度器时将发布的内容列表