问题标签 [reference-wrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
123 浏览

c++ - 为什么要通过向量的元素删除引用的值> 不会使向量无效?

我发现了 std::reference_wrapper 提供的好工具,但这种行为对我来说听起来很奇怪。

为什么擦除vec ( vectorA[9] ) 中引用的元素不会影响向量vec的大小?此外,为什么vec[9]仍然可以访问?

0 投票
1 回答
90 浏览

c++ - 参考包装不在 cout 中打印,而是在 reference_wrapper 中打印做?

为什么我试图打印“reference_wrapper for string”的行对不支持的 operator<< “reference_wrapper for string”给出错误,但没有给出“reference_wrapper for int”?

0 投票
2 回答
107 浏览

c++ - C++ reference_wrapper 向量填充了错误的值

我正在尝试在 C++ 中使用引用包装器,因为我希望能够直接更改对象的值,但它们的值都是错误的。这是一个演示此问题的示例:

它打印

我不确定为什么引用包装向量v2没有复制引用的值v1...

编辑:这是另一个神秘地不起作用的例子。我认为这一篇中没有任何悬而未决的参考资料。

它打印9596312 1 2,而我希望它打印0 1 2......

0 投票
1 回答
85 浏览

c++ - std::ref 隐式转换为引用混淆

我知道 std::ref(object) 创建了 std::reference_wrapper(object),并且 std::reference_wrapper 具有非显式类型转换运算符成员函数

而且我知道这会影响我在模板参数推导发挥作用时使用它的方式:所以在下面的打印中,如果我用 std::ref("你好”)

为什么这一行不编译?

实例化的特化应该有一个

类型转换函数,那么为什么我不能使用这样的引用包装器呢?

0 投票
1 回答
40 浏览

c++ - 自定义引用包装器的 const 正确性

我在boost::variant通过网络发送数据时用来实现类型擦除。当数据到达客户端或服务器时,我正在检查其结构以检索基础信息并在结构与 API 中约定的结构不匹配时报告错误。为此,我创建了一个轻量级引用包装器,它包含对变体的引用,并为结构检查和类型转换提供了一个方便的接口。

不幸的是,这个接口被证明很麻烦,因为每个具有view成员的聚合类型都需要遵循相同的 const/non-const 拆分。我想知道将这两个类合并到一个视图中并在创建如下视图的方法中使用 const_cast 是否合法:

0 投票
1 回答
82 浏览

c++ - 非模板 std::reference_wrapper 赋值运算符和模板构造函数

在 C++ 20 标准中,类模板的构造函数std::reference_wrapper是一个模板。

而赋值运算符不是模板

这些特殊成员函数之间存在这种差异(模板和非模板)的原因是什么?

另一方面,我使用 Visual C++ 2019 尝试了以下程序。

并且编译器没有发出与赋值运算符相关的错误消息。

它是编译器的错误还是我错过了什么?

0 投票
1 回答
174 浏览

c++ - reference_wrapper 导致“不允许不完整的类型”

最后一行不会编译,因为“不允许不完整的类型”。当我在互联网上搜索时,一篇论文似乎解决了这个问题:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0357r3.html 。那篇论文刚好在我的水平之上。所以我不确定。有人会确认或解决此问题吗?

此外,解决方法表示赞赏:

我正在尝试将路线存储在不太大的格子上。会有很多路线(格子密集)。所以,我在想,在一条路线中,存储点的参考而不是点以节省内存。

0 投票
0 回答
55 浏览

c++ - 使用 std::ref,退出函数后内容不会改变

我一直在用线程实现 Strassen 算法。我已经通过结构将数据传递给线程并通过函数启动它们pthread_create()。问题是我正在操作 std::vector < std::vector<int> > ,我不能通过引用将它传递给结构。我做了一些研究并决定使用std::ref 它来包装内容并将其发送到功能。退出功能后问题开始;r1 值没有变化(内部变化),所以有些地方不正确。

示例代码:

如何解决?

注意: *add_Thread() 工作正常;我在我的程序中使用数组。这里的代码只是为了展示想法。

0 投票
0 回答
34 浏览

c++ - 使用原始参考或 std::reference_wrapper

我注意到 C++11 中 std::reference_wrapper 的实现,但是,我想知道为什么我应该使用 std::reference_wrapper 而不是“原始”引用变量。

我知道引用包装器是一个可以复制的对象,但是,我为什么要使用它而不是引用?这个功能有什么意义?让我们考虑以下伪代码

为什么我更喜欢bar而不是foo

0 投票
1 回答
123 浏览

c++17 - 向量..事情超出范围?它是如何工作的?

用例:我正在将数据从我的一个非常旧的程序转换为数据库友好格式。有些部分我必须对旧数据进行多次传递,因为特别是在我可以在关系中引用它们之前,键必须首先存在。所以我想为什么不在第一次通过时将不完整的部分放在引用向量中并从工作函数中返回,这样我就可以轻松地使用该向量对仍然不完整的部分进行第二次传递。我喜欢尽可能避免使用指针,所以我研究了std::reference_wrapper<T>这似乎正是我需要的......除了我根本不明白它的行为。

我两者都有vector<OldData> old_data,并且vector<NewData> new_data是我的转换班的成员。转换成员函数本质上是:

但是,在循环incomplete之后立即被打破。for该程序编译,但崩溃并产生乱码。现在我不知道我ref是否正确放置,但这只是我尝试将它放在其他地方的众多尝试之一,使用push_backemplace_back代替等。.. 似乎有些东西超出了范围,但是什么?两者都是类成员,new_data也存在于循环之外,并且根据文档,是可复制的。old_dataincompletereference_wrapper

这是一个简化的 MWE,它编译、崩溃并产生乱码:

如果这意味着什么g++ 10.2.0-std=c++17现在我可能只使用指针并完成,但我想了解这里发生了什么,文档/搜索似乎没有帮助..