我正在使用返回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)
。但是我完全不了解幕后情况。
有人知道这里发生了什么吗?