我对一些涉及引用和 std::reference_wrapper 的代码感到困惑,我完全不清楚这是否是我的错,因为我误解了引用包装器的工作原理,或者我是否遇到了编译器错误。
我有一个简单的映射,将对来自复杂类的对象的引用与一个值配对:
std::unordered_map<Object const &obj, int32_t value> myMap;
(为简单起见,我明确省略了地图编译所需的哈希和相等函子)
由于我不能直接使用地图中的引用,因此我使用了引用包装器:
std::unordered_map<std::reference_wrapper<const Object> obj, int32_t value> myMap;
现在,我的地图填充在一个函数中,例如:
void myFunction(Object const &obj, int32_t value)
{
...
myMap.emplace(std::make_pair(obj, value));
}
但是该代码虽然可以编译,但不起作用。但是,这个按预期工作:
void myFunction(Object const &obj, int32_t value)
{
...
myMap.emplace(std::pair<std::reference_wrapper<const Object>, int32_t>(obj, value));
}
(请注意,在第二个版本中,我仍然没有明确构建 obj 的引用包装器)
所以,我的疑问是:
我对引用包装器的使用有误解吗?没有从引用到reference_wrapper 的隐式转换?如果不是,为什么代码首先编译?
或者这是 std::make_pair 中的一个已知问题/缺陷无法正确扣除传递给它的类型?