标签: reference-wrapper

值类型为reference_wrapper时的unordered_map值赋值

我正在试验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++ reference c++11 reference-wrapper

1
推荐指数
1
解决办法
184
查看次数

为什么`std :: reference_wrapper`在c ++ 17中已弃用并在c ++ 20中被删除?

从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++ c++11 reference-wrapper c++17 c++20

1
推荐指数
1
解决办法
620
查看次数

如何从std :: vector <std :: reference_wrapper>获取C数组

我是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课程?谢谢

c stdvector c++11 reference-wrapper

0
推荐指数
1
解决办法
66
查看次数

使用reference_wrappers初始化向量

我正在尝试使用引用包装器向量运行一个示例,但在向量变量声明处遇到编译错误。这是代码:

\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:

\n\n
/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                                                         ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

?\n(如果重要的话,使用 gcc -std=c++17 构建)

\n

c++ vector initializer-list reference-wrapper

0
推荐指数
1
解决办法
893
查看次数

Reference_wrapper:Push_back有效,但没有分配

在下面的代码,push_back()std::refstd::vector<reference_wrapper<Type>>行之有效然而,分配std::refreference_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)

c++ stdvector c++11 reference-wrapper

-2
推荐指数
1
解决办法
876
查看次数

非初始化reference_wrapper的返回值

reference_wrapper当我resize()在下面的向量时,指向何处?这是一个未定义的行为吗?我该怎么做才能安全?

std::vector < std::reference_wrapper <int> > vec;
vec.resize(10);
Run Code Online (Sandbox Code Playgroud)

c++ vector c++11 reference-wrapper

-3
推荐指数
1
解决办法
393
查看次数