c++ - unordered_map 值类型为 reference_wrapper 时的赋值

标签 c++ c++11 reference reference-wrapper

我正在试验 std::reference_wrapper。我不明白为什么以下内容适用于 std::vector 但不适用于 std::unordered_map:

#include <functional>
#include <vector>
#include <unordered_map>

using namespace std;

int main()
{
  vector<vector<long>> x;

  vector<reference_wrapper<vector<vector<long>>>> y;
  y.push_back(ref(x)); // OK

  unordered_map<string, reference_wrapper<vector<vector<long>>>> m;
  m["lol"] = ref(x); // NOT OK
}

这是我得到的编译错误

/usr/include/c++/7.2.0/tuple:1652:70: error: no matching function for call to ‘std::
reference_wrapper<std::vector<std::vector<long int> > >::reference_wrapper()’       
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
In file included from /usr/include/c++/7.2.0/bits/std_function.h:44:0,              
                 from /usr/include/c++/7.2.0/functional:58,                         
                 from test.cpp:1:         
/usr/include/c++/7.2.0/bits/refwrap.h:325:7: note: candidate: constexpr std::referen
ce_wrapper<_Tp>::reference_wrapper(const std::reference_wrapper<_Tp>&) [with _Tp = s
td::vector<std::vector<long int> >]       
       reference_wrapper(const reference_wrapper&) = default;                       
       ^~~~~~~~~~~~~~~~~
/usr/include/c++/7.2.0/bits/refwrap.h:325:7: note:   candidate expects 1 argument, 0
 provided            
/usr/include/c++/7.2.0/bits/refwrap.h:319:7: note: candidate: std::reference_wrapper
<_Tp>::reference_wrapper(_Tp&) [with _Tp = std::vector<std::vector<long int> >]     
       reference_wrapper(_Tp& __indata) noexcept                                    
       ^~~~~~~~~~~~~~~~~
/usr/include/c++/7.2.0/bits/refwrap.h:319:7: note:   candidate expects 1 argument, 0
 provided  

谁能解释一下我做错了什么?

最佳答案

m["lol"] 使用无序映射 operator[]。该运算符返回对 map 中项目的引用。如果没有这样的项目,这是有问题的。

为了解决这个问题,它将默认构造它应该返回的项目。这就是问题所在,因为 std::reference_wrapper 不是默认可构造的。

为了使这两个示例更加等价,您需要使用 std::unordered_map::insertstd::unordered_map::emplace

关于c++ - unordered_map 值类型为 reference_wrapper 时的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614984/

相关文章:

c++ - 我应该使用指针还是 move 语义来传递大块数据?

java - 2 个集合中的一个对象(引用)

reference - 延长 Rust 的借用生命周期

c++ - 如何使用添加到 MFC Doc/Frame 项目的对话框的初始化列表

c++ - 在 C++ 中使用结构的 STL 列表

algorithm - 为什么 <algorithm> 函数中的 std::set 将非 const 对象更改为 const?

java - 我如何在 Java 中一次更改多个引用?

c++ - 访问模板外的模板(类)参数

c++ - 在 C++ 中,如何在类和函数的 header 中编写完整的实现(可能是模板化的)

c++ - 使用 for_each() 和 lambda 函数打印 C 风格数组的模板函数