问题标签 [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 回答
216 浏览

c++ - 带引用的 std::pair 和引用包装器有什么区别

我已经陷入了我所做的错误假设。我发现

是一件事。但是我没想到以下会失败

然而,分配后的第二组测试失败,因为

我有点期望它的行为类似于引用包装器,其中底层指针将被复制,但这似乎不是它的工作方式。是否有一些明确的理由说明为什么行为与使用不同

如果我运行与上面相同的测试但使用 reference_wrapper 则它可以工作。

这两种形式之间应该有区别吗?

0 投票
1 回答
101 浏览

c++ - 如何正确调整复杂向量的大小?

我有这样的课:

在类的构造函数中,我调整了向量的大小,就像这样table.resize(indexSize)

但是当我尝试推送项目时出现错误:

我想当我调整大小时,我需要传递某种构造函数?

我得到的错误是:

没有重载函数的实例 "std::vector<_Tp, _Alloc>::push_back [with _Tp=std::pair<uint32_t, std::reference_wrapper<std::vector<uint8_t, std::allocator<uint8_t>>> >, _Alloc=std::allocator<std::pair<uint32_t, std::reference_wrapper<std::vector<uint8_t, std::allocator<uint8_t>>>>>]" 匹配参数列表——参数类型是: (std::pair<uint32_t, std::vector<uint8_t, std::allocator<uint8_t>>>) -- 对象类型为:std::vector<std::pair<uint32_t, std::reference_wrapper<std ::vector<uint8_t, std::allocator<uint8_t>>>>, std::allocator<std::pair<uint32_t, std::reference_wrapper<std::vector<uint8_t, std::allocator<uint8_t>>> >>>

0 投票
1 回答
82 浏览

c++ - std::reference_wrapper 与 int&

我正在尝试std::reference_wrapper使用以下代码段

输出是t[0] = 52, a = 42, b = 52,这并不奇怪。

但是,如果我只使用autofor t,即

然后我得到了t[0] = 52, a = 52, b = 52

看起来类型变成了int&。然后我有几个问题:

  1. 我想std::ref给我们std::reference_wrapper而不是&
  2. 我应该如何解释的情况&以及为什么它不同于std::reference_wrapper.
  3. 我还注意到,在 的情况下std::reference_wrapperstd::get<0>(t) = 52;不会编译。(虽然在&它的情况下)。错误是“调用类 'std::__1::reference_wrapper' 的私有构造函数”。有人可以更详细地解释一下吗?

谢谢!!

0 投票
1 回答
223 浏览

c++ - 为了使 std::ref 工作的唯一目的, std::reference_wrapper 实现的关键是什么?

std::ref/页面上的示例std::cref显示了使用std::ref/以一种看起来像通过引用获取参数的方式std::cref传递参数,而实际上它通过值获取所有参数。std::bindstd::bind

只看那个例子,我也可能对 的存在一无所知std::reference_wrapper,并且std::ref只是一个允许链接示例表现出的行为的函数。

这就是我std::ref问题标题和以下内容中的意思。

主要是为了好玩,我尝试实现std::ref自己,我想出了这个:

在标记为// Ooops我错误地使用 CTAD行上,因为我正在使用-std=c++17. 通过更改ref_wrapperref_wrapper<T>ref_wrapper<const T>在这两种情况下更正了这一点。

然后我偷看了一眼/usr/include/c++/10.2.0/bits/refwrap.h

一方面,我看到 / 的实现与/ref的实现cref非常相似。std::refstd::cref

另一方面,我看到它std::reference_wrapper大约有 60 行长!里面有很多东西,包括noexcept, 宏, 复制 ctor, 复制operator=, get.

我认为其中大部分与std::reference_wrapper 仅用作从属std::ref无关,但有些东西可能是相关的,例如构造函数采用通用引用。

所以我的问题是:就我的瘦身尝试而言,工作的std::reference_wrapper必要条件和充分条件是什么?std::ref

我刚刚意识到std::reference_wrapper on cppreference有一个可能的实现(它比来自 GCC 的噪音小)。然而,即使在这里,也有一些我不明白的原因,例如operator()

0 投票
1 回答
84 浏览

c++ - 排序 std::reference_wrapper 数组时出现问题,引用向量

我对此有点坚持,我正在使用 std::array 将引用包装器存储到向量。我试图使用 std::sort 按向量的大小对它们进行排序,但由于我不太确定的原因,即使在阅读了编译器错误之后也是如此。我是否必须使用另一个排序函数,因为似乎 std::sort 实现使用了无法在引用包装器上使用的操作。

谢谢 :)

编译器资源管理器版本

0 投票
2 回答
76 浏览

c++ - std::list 的概念受限的基于范围的 for 循环>

我有一些 classFoo和 astd::list<std::reference_wrapper<Foo>>并且想使用基于范围的 for 循环迭代它的元素:

注意,当我们推断出 typeget()时,在捕获时附加了额外的内容,而在第二种情况下,当我们显式地捕获此类型时,已经隐式转换为类型。autostd::reference_wrapper<Foo>fooFoo&

我实际上是在寻找一种方法来捕捉 auto 但隐含地抛弃了std::reference_wrapper隐含的方法,以便不必一直get()在体内打扰该方法for,所以我尝试引入一个合适的概念并抓住它,即我尝试了

并希望它能奏效。clang但是推导出footo的类型std::reference_wrapper<Foo>,因此实际上下面的代码是正确的:

但是,gcc完全拒绝接受基于范围的 for 循环并抱怨deduced initializer does not satisfy placeholder constraints,因为它试图检查LikeFoo<std::reference_wrapper<Foo>>,这当然评估为 false,因此gcc甚至无法捕获foo概念限制。出现两个问题:

  • 哪个编译器是正确的?应该LikeFoo auto& foo : refs有效吗?
  • 有没有一种方法可以自动捕获(可能是概念受限的)foo : refs,这样就可以避免get()for循环体中写入?

您可以在编译器资源管理器中找到此示例。

0 投票
1 回答
65 浏览

c++ - std::reference_wrapper 之间的最佳可行重载函数和T

最近,我决定编写一个类来存储带有 reference_wrapper<const vector> 和 vector 的变体,以便选择拥有该值或仅具有它的引用。即,std::variant<vector<string>, reference_wrapper<const vector<string>>>

有趣的部分是变体根据初始化存储的内容。我做了一个小调查,结果证明,在所有情况下vector<string>,类型都会获胜,除了通过 std::cref 传递的情况。这同样适用于函数(有些意料之中,因为构造函数在这种方式上类似于函数)

问题是为什么vector<string>这里有优先权。我在这里查看了最佳可行功能部分,但没有多大意义。看起来

部分选择(因为vector<string>构造函数是模板化的),但我不确定,因为使用规则我无法完全理解它们是否相等reference_wrapper<vector<string>>reference_wrapper

有人可以描述在每种情况下应用的所有隐式转换,并说明一个重载优于另一个重载的真正原因吗?对我来说,它们如下:

我错过了什么?

另一个与此主题相关的问题:再次对隐式转换序列部分进行排名,这里留下一个问题,被T(const T&)认为是精确匹配(用户定义的类类型到同一类的转换)或转换

0 投票
1 回答
107 浏览

c++ - 为什么 std::reference_wrapper 的这种用法不修改原来的?

我在正确使用 C++ 中的内置和引用时遇到问题。我有一个名为“Entity”的类的实例,它是在 main() 函数中创建的。我还有一个名为“Simulation”的类的实例 Simulation 类有一个名为:addEntity(Entity e) 的函数 我认为将实例传递给这个函数只会创建它的副本,因为 Simulation 类然后使用这个实例来改变是数据。数据更改后,main() 中的实例保持其默认值。

代码:

这是 addEntity 函数:

此函数使用 Entity 实例来调用它们的公共函数。

这是改变实体实例内部变量的tick方法

但是当我在它应该被上面的代码编辑之后尝试使用实例时,它仍然保留它的默认值......

0 投票
1 回答
52 浏览

c++ - C++ 引用包装器作为函数参数

据我了解,引用包装器只是引用的包装器,没什么特别的。但是为什么当作为函数参数传递时它被视为函数内部的引用本身(而不是包装器)?

为什么 ref(x) 在函数调用中被视为 x 本身?我遇到这个问题是因为我试图了解在不同线程之间传递数据时 ref() 的使用。我认为 ref() 是必要的,因此任何带有 '&' 的函数参数都不需要重写以避免线程相互干扰。但是为什么线程可以在不使用 x.get() 的情况下将 ref(x) 视为 x 呢?

0 投票
1 回答
131 浏览

c++ - std::reference_wrapper,构造函数实现说明

我一直试图从这里std::reference_wrapper了解 , 的实现,如下所示:

尽管 std::reference_wrapper 的实现已在此处此处进行了讨论,但没有一个讨论我感到困惑的构造函数实现。我的困惑是: 1.) 构造函数是一个模板函数,采用U与模板类 param 不同的类型 param() T。我已经看到一个类的成员函数是模板函数,并且取决于不同的类型参数,然后是模板类的类型参数,但我想不出它在这里是如何工作的。这里有一个相关的问题,但我无法将它与我的困惑联系起来。2.)我看到构造函数中的第二个类型参数被进一步用来sfinae出来的东西,但我不明白如何detail::FUN<T>(std::declval<U>())被评估。

有人可以解释一下吗?

编辑:这是从microsoft.docs添加的示例。该示例的一个片段是:

有了reference_wrapper的实现,又从 A.1哪里调用reference_wrapper的构造函数呢?假设detail::FUN<T>(std::declval<U>()将调用detail::FUN<T>(std::declval<int>(), 应该是由于deleted重载而导致的替换失败(假设std::declval<int>将被读取为对 int 的右值引用)。我在这里想念什么?