gpt4 book ai didi

c++ - 为什么我不能将 std::map 的条目解压到引用中?

转载 作者:行者123 更新时间:2023-12-04 12:27:50 24 4
gpt4 key购买 nike

我注意到从 std::map 解包键和值不给我引用。我假设 std::map 中的单个条目存储为一对 const 键和值。
什么工作:

  • 手动取.second一对来自 std::map成引用。
  • 拆开一对使用 std::make_pair 制成的成引用。
  • std::views::values 的结果中获取引用

  • 什么不起作用:
  • 将 for 循环中的映射条目直接解包为引用
  • 将从迭代器获得的映射条目解包到引用中

  • 为什么以上两个不起作用?附件是示例源代码,以及从 IDE 中推导出的类型。编译器确实会导致与插入相同的错误消息。
    #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;
    }
    deduced types

    最佳答案

    它是一个引用。但是,有一个特殊的规则,decltype在结构化绑定(bind)上(来自 [dcl.type.decltype]/1.1 ):

    • if E is an unparenthesized id-expression naming a structured binding ([dcl.struct.bind]), decltype(E) is the referenced type as given in the specification of the structured binding declaration;

    映射对(即 pair<Key const, Value>)的引用类型只是 Key constValue ,从来没有任何引用。

    关于c++ - 为什么我不能将 std::map 的条目解压到引用中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69236159/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com