我正在试验std::reference_wrapper.我不明白为什么以下内容适用于a 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
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的编译错误
/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;
^~~~~~~~~~~~~~~~~ …Run Code Online (Sandbox Code Playgroud) 从C++ 11开始,它std::reference_wrapper是一个小的"垫片"模板,它是一种类型,可以从引用类型构造并转换为引用类型.它可以在通用容器中使用,否则可能不支持引用.
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
std :: reference_wrapper是一个类模板,它在可复制的可分配对象中包装引用.它经常被用作在标准容器(如std :: vector)中存储引用的机制,它通常不能保存引用.
此标准库功能在C++ 17中已弃用,并在当前的C++ 20草案中删除.为什么?
std::reference_wrapper以某种方式使用或有缺陷是不安全的吗?
在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r3.html#2.0中
,似乎这部分被认为是"D.8旧适应性功能绑定"的一部分,标准描述中的文本在std::reference_wrapper"D.9.2 Typedef to Support Function Binders [depr.func.adaptor.typedefs]"部分中划掉
看来我们正在删除它,因为它在旧的函数绑定器API中扮演了一个角色,但它实际上在容器中有其他用途,如参考页面所述.是否有一些我遗漏的东西取代了那个用例,或者我错过了这种情况的其他东西?
如果要删除这个有用的功能,我们是否应该在需要时实现它,或者是否有某些原因导致整个模式不安全?
我是C++ 11的新手,我对std::refence_wrapper课程的使用感到困惑.
让我们考虑一下https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper中显示的示例
,它会混淆标准中包含的元素std::vector,即:
std::vector<int> l(10);
std::iota(l.begin(), l.end(), -4);
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});
Run Code Online (Sandbox Code Playgroud)
现在,如果考虑原始向量l,我会l.data()返回一个指向内部数组的指针,我可以在C应用程序中使用它.
相反,我不清楚返回的是什么v.data().我尝试了各种肯定错误的转换的组合,例如int* p = (int*)(v.data()->get())没有获得正确的结果(交换的值).
我的目标是将C++应用程序(它给我一个引用包装器的向量)与旧的C库连接起来.v在示例中显示的shuffle之后,你能指出我从向量中获取类C数组的最正确方法吗?我是否需要在另一个向量中逐个复制所有元素?有没有可以帮助我完成工作的C++ 11课程?谢谢
我正在尝试使用引用包装器向量运行一个示例,但在向量变量声明处遇到编译错误。这是代码:
\n\n#include <iostream>\n#include <vector>\n#include <functional>\n\nusing namespace std;\n\nstruct Base\n{\n virtual void print() = 0;\n};\n\nstruct X1: public Base\n{\n void print() override\n {\n cout << "X1\\n";\n }\n};\n\nstruct X2: public Base\n{\n void print() override\n {\n cout << "X2\\n";\n }\n};\n\n\nint main()\n{\n X1 x1;\n X2 x2;\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n}\nRun Code Online (Sandbox Code Playgroud)\n\n向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:
/home/u1/sandbox/c++/trash/untitled/main.cpp:33: error: no matching function for call to \xe2\x80\x98std::vector<std::reference_wrapper<Base> >::vector(<brace-enclosed initializer list>)\xe2\x80\x99\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n?\n(如果重要的话,使用 gcc -std=c++17 构建)
\n在下面的代码,push_back()一std::ref成std::vector<reference_wrapper<Type>>行之有效然而,分配std::ref到reference_wrapper<Type>不起作用.为什么?
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
struct Type {};
int main()
{
Type t1;
vector<reference_wrapper<Type>> t2;
t2.push_back( ref(t1) ); // OK
//reference_wrapper<Type> t3; // error: no matching function for call to std::reference_wrapper<Type>::reference_wrapper()’
//t3 = ref(t1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) reference_wrapper当我resize()在下面的向量时,指向何处?这是一个未定义的行为吗?我该怎么做才能安全?
std::vector < std::reference_wrapper <int> > vec;
vec.resize(10);
Run Code Online (Sandbox Code Playgroud)