Перегрузка any_cast
, которую вы используете (# 2), дает вам копию значения, содержащегося в any
, а не ссылку на него. Таким образом, map
, который вы вставляете, отличается от map
от того, который содержит any
.
Если вы хотите напрямую изменить то, что держит any
, вам нужно использовать одну из перегрузок, которые принимают указатель any
(т. Е. # 5):
std::any a = 1;
int* p = std::any_cast<int>(&a); // <== like this
assert(p);
*p = 42;
assert(std::any_cast<int>(a) == 42);
Или вы можете явно указать ссылочный тип в any_cast
:
std::any a = 1;
std::any_cast<int&>(a) = 42; // <== int&, not int
assert(std::any_cast<int>(a) == 42);
<ч />
Также обратите внимание, что даже если any_cast
сам не давал вам копию, вы делаете ее самостоятельно, написав:
auto originalMap = ...;
вместо ссылки на результат. Итак, вы, вероятно, хотели:
auto& map = std::any_cast<std::map<...>&>(_container);