为什么我不能解压std::映射到引用的条目?

2022-01-30 07:48:05 标签 c++visual-c++c++20

我注意到,从std::map解包键和值并没有给我引用。我假设std::map中的单个条目存储为一对const键和值。

哪些是有效的方式:

手工花.second of pair from std::map into referenc为参考。

拆开包装一对用std::make_pair into references.为引用。

引用的结果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;
}

###这是一个引用。但是有一个特殊的规则decltype on a structured binding does (from [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;

而map的pair引用类型(pair<Key const Value>)就是Key const, Value绝不是任何类型的引用。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码