首页 > 解决方案 > 为什么将 std::make_pair 传递给 map::insert 不起作用?

问题描述

我在玩一个 C++ API,它返回一个const std::vector<uint8_t>&. 我尝试将其存储到 astd::map中以供进一步使用,并注意到由于const对象的性质,我无法将其分配给带有[]. 所以,我改用了,但是当函数被直接调用到函数中而没有任何临时变量时,我insert遇到了一个奇怪的行为。std::make_pair()insert

#include <vector>
#include <iostream>
#include <map>
#include <string>
#include <utility>

int main(){
    std::map<const std::string, const std::vector<uint8_t>&> vectest;
    std::vector<uint8_t> val1 = {0x0, 0x1};
    std::vector<uint8_t> val2 = {0x0, 0x1};
    std::vector<uint8_t> val3 = {0x0, 0x1};

    std::string key1 = "test1";
    std::string key2 = "test2";
    std::string key3 = "test3";

    auto pair = std::make_pair(key1, val1);
    vectest.insert(pair);
    vectest.insert(std::make_pair(key2, val2));
    vectest.insert(std::make_pair(key3, std::cref(val3)));
    std::cout<<"test size map : "<<vectest.at(key1).size()<<std::endl;
    std::cout<<"test size map : "<<vectest.at(key2).size()<<std::endl;
    std::cout<<"test size map : "<<vectest.at(key3).size()<<std::endl;
}

这是输出:

test size map : 2
test size map : 0
test size map : 2

我在某个地方读到了std::make_pair可能不支持引用的地方,而我应该使用它the std::cref(val2)。但我根本不明白引擎盖下发生了什么。

有谁知道这里发生了什么?

标签: c++dictionaryvectorreferencestd

解决方案


推荐阅读