我注意到从
可以使用以下方式工作:
std::map
中解包键和值不会给我引用。我假设std::map
中的单个条目存储为const键值对。可以使用以下方式工作:
- 将
std::map
中的pair手动转换为引用。 - 将使用
std::make_pair
创建的pair解包为引用。 - 从
std::views::values
的结果中获取引用。
- 直接将map条目在for循环中解包为引用
- 将从迭代器获取的map条目解包为引用
#include <map>
#include <type_traits>
#include <ranges>
int main() {
std::map<int, int> data;
for (const auto& kv : data) {
auto& v = kv.second;
auto& [a, b] = kv;
static_assert(std::is_reference_v<decltype(v)>);
}
for (const auto& v : data | std::views::values)
static_assert(std::is_reference_v<decltype(v)>);
for (const auto& [k, v] : data)
static_assert(std::is_reference_v<decltype(v)>); // error
{
auto& kv = *data.begin();
auto& [k, v] = kv;
static_assert(std::is_reference_v<decltype(v)>); // error
}
{
auto kv = std::make_pair(3, 5);
auto& k = kv.first;
auto& v = kv.second;
static_assert(std::is_reference_v<decltype(v)>);
}
return 0;
}
std::map
无关。只是结构化绑定中的名称不是引用。相关/重复 https://dev59.com/x0kGtIcB2Jgan1znD7mK - cigienauto& [k2, v2] = kv;
会产生什么结果。这确实也会导致两个非引用。 - kizerauto&
,它就是一个引用。k
和v
是它的成员。您可以更改v
,并且它将反映回map
。 - n. m.