为什么将std :: make_pair传递给map :: insert不起作用?

时间:2019-05-14 12:04:19

标签: c++ dictionary vector reference std

我正在使用返回const std::vector<uint8_t>&的C ++ API。我尝试将其存储到std::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)。但是我完全不了解幕后情况。

有人知道这里发生了什么吗?

0 个答案:

没有答案