boost_multi_index迭代器取消引用给出常量

boost_multi_index iterator dereference gives const

本文关键字:常量 引用 迭代器 multi index boost 取消      更新时间:2023-10-16

这与迭代器的取消引用boost_multi_index hashed_index有关。请参阅下面的代码:

using namespace boost;
using namespace boost::multi_index;
using Container = boost::multi_index_container<
std::string,
indexed_by<hashed_unique<const_mem_fun<std::string, size_t, &std::string::size>>>>;
Container container;
auto& hash_map = container.get<0>();
auto[it, inserted] = hash_map.insert("1234");
if (!inserted)
*it = "1234";

这给了:

error: no match for 'operator=' (operand types are 'const value_type {aka const std::__cxx11::basic_string<char>}' and 'const char [5]')
*it = "1234";
^~~~~~

因此,看起来可以在迭代器it引用的对象上仅调用 const 方法。

  1. 为什么要这样做?(容器是否能够跟踪所有更改?
  2. 有没有更好/另一种方法来写入引用的对象?

Boost.MultiIndex 迭代器是常量(不会给你对元素的非常量访问权限(,因为否则值可能会在拥有multi_index_container不知道的情况下更改,这会导致元素错位、未定义的行为等。例如,这与std::set中的迭代器的情况相同。

要修改元素,此处讨论了各种功能。请注意,该文档是 C++11 之前的,没有提到将 lambda 表达式与modify结合使用,如下所示:

hash_map.modify(it,[](std::string& x){x="1234";});