C++ 值类型为引用时的无序映射值赋值
我正在试验C++ 值类型为引用时的无序映射值赋值,c++,c++11,reference,reference-wrapper,C++,C++11,Reference,Reference Wrapper,我正在试验std::reference\u包装器。我不明白为什么下面的方法适用于std::vector,但不适用于std::unordered\u map: #include <functional> #include <vector> #include <unordered_map> using namespace std; int main() { vector<vector<long>> x; vector<r
std::reference\u包装器
。我不明白为什么下面的方法适用于std::vector
,但不适用于std::unordered\u 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
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量x;
向量y;
y、 向后推(参考(x));//确定
无序地图m;
m[“lol”]=ref(x);//不正常
}
这是我得到的编译错误
/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
/usr/include/c++/7.2.0/tuple:1652:70:错误:调用“std:”时没有匹配函数:
reference_wrapper::reference_wrapper()'
第二个(std::forward(std::get(_tuple2))…)
^
在/usr/include/c++/7.2.0/bits/std_function.h:44:0中包含的文件中,
从/usr/include/c++/7.2.0/functional:58,
来自测试。cpp:1:
/usr/include/c++/7.2.0/bits/refwrap.h:325:7:note:candidate:constepr std::referen
ce_包装器::引用_包装器(const std::引用_包装器&)[带_Tp=s
td::向量]
reference\u wrapper(const reference\u wrapper&)=默认值;
^~~~~~~~~~~~~~~~~
/usr/include/c++/7.2.0/bits/refwrap.h:325:7:注意:候选者需要1个参数,0
假如
/usr/include/c++/7.2.0/bits/refwrap.h:319:7:note:candidate:std::reference\u包装器
::reference_wrapper(_-Tp&)[带_-Tp=std::vector]
引用包装器(\u Tp和\u indata)不例外
^~~~~~~~~~~~~~~~~
/usr/include/c++/7.2.0/bits/refwrap.h:319:7:注意:候选者需要1个参数,0
假如
有人能解释一下我做错了什么吗?m[“lol”]
使用无序映射操作符[]
。该运算符返回对映射中项目的引用。如果没有这样的项目,这是有问题的
为了解决这个问题,它将默认构造它应该返回的项。问题就在这里,因为std::reference\u wrapper
不是默认可构造的
为了使这两个示例更加等效,您需要使用
std::无序映射::insert
或std::无序映射::emplace
啊!有道理!刚刚尝试了m.insert({“lol”,ref(x)})代码>成功了。谢谢:)