问题标签 [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.
c++ - 带引用的 std::pair 和引用包装器有什么区别
我已经陷入了我所做的错误假设。我发现
是一件事。但是我没想到以下会失败
然而,分配后的第二组测试失败,因为
我有点期望它的行为类似于引用包装器,其中底层指针将被复制,但这似乎不是它的工作方式。是否有一些明确的理由说明为什么行为与使用不同
如果我运行与上面相同的测试但使用 reference_wrapper 则它可以工作。
这两种形式之间应该有区别吗?
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>>> >>>
c++ - std::reference_wrapper 与 int&
我正在尝试std::reference_wrapper
使用以下代码段
输出是t[0] = 52, a = 42, b = 52
,这并不奇怪。
但是,如果我只使用auto
for t
,即
然后我得到了t[0] = 52, a = 52, b = 52
看起来类型变成了int&
。然后我有几个问题:
- 我想
std::ref
给我们std::reference_wrapper
而不是&
? - 我应该如何解释的情况
&
以及为什么它不同于std::reference_wrapper
. - 我还注意到,在 的情况下
std::reference_wrapper
,std::get<0>(t) = 52;
不会编译。(虽然在&
它的情况下)。错误是“调用类 'std::__1::reference_wrapper' 的私有构造函数”。有人可以更详细地解释一下吗?
谢谢!!
c++ - 为了使 std::ref 工作的唯一目的, std::reference_wrapper 实现的关键是什么?
std::ref
/页面上的示例std::cref
显示了使用std::ref
/以一种看起来像通过引用获取参数的方式std::cref
传递参数,而实际上它通过值获取所有参数。std::bind
std::bind
只看那个例子,我也可能对 的存在一无所知std::reference_wrapper
,并且std::ref
只是一个允许链接示例表现出的行为的函数。
这就是我std::ref
在问题标题和以下内容中的意思。
主要是为了好玩,我尝试实现std::ref
自己,我想出了这个:
在标记为// Ooops
我错误地使用 CTAD的行上,因为我正在使用-std=c++17
. 通过更改ref_wrapper
为ref_wrapper<T>
并ref_wrapper<const T>
在这两种情况下更正了这一点。
然后我偷看了一眼/usr/include/c++/10.2.0/bits/refwrap.h
。
一方面,我看到 / 的实现与/ref
的实现cref
非常相似。std::ref
std::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()
。
c++ - 排序 std::reference_wrapper 数组时出现问题,引用向量
我对此有点坚持,我正在使用 std::array 将引用包装器存储到向量。我试图使用 std::sort 按向量的大小对它们进行排序,但由于我不太确定的原因,即使在阅读了编译器错误之后也是如此。我是否必须使用另一个排序函数,因为似乎 std::sort 实现使用了无法在引用包装器上使用的操作。
谢谢 :)
c++ - std::list 的概念受限的基于范围的 for 循环>
我有一些 classFoo
和 astd::list<std::reference_wrapper<Foo>>
并且想使用基于范围的 for 循环迭代它的元素:
注意,当我们推断出 typeget()
时,在捕获时附加了额外的内容,而在第二种情况下,当我们显式地捕获此类型时,已经隐式转换为类型。auto
std::reference_wrapper<Foo>
foo
Foo&
我实际上是在寻找一种方法来捕捉 auto 但隐含地抛弃了std::reference_wrapper
隐含的方法,以便不必一直get()
在体内打扰该方法for
,所以我尝试引入一个合适的概念并抓住它,即我尝试了
并希望它能奏效。clang
但是推导出foo
to的类型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
循环体中写入?
您可以在编译器资源管理器中找到此示例。
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&)
认为是精确匹配(用户定义的类类型到同一类的转换)或转换?
c++ - 为什么 std::reference_wrapper 的这种用法不修改原来的?
我在正确使用 C++ 中的内置和引用时遇到问题。我有一个名为“Entity”的类的实例,它是在 main() 函数中创建的。我还有一个名为“Simulation”的类的实例 Simulation 类有一个名为:addEntity(Entity e) 的函数 我认为将实例传递给这个函数只会创建它的副本,因为 Simulation 类然后使用这个实例来改变是数据。数据更改后,main() 中的实例保持其默认值。
代码:
这是 addEntity 函数:
此函数使用 Entity 实例来调用它们的公共函数。
这是改变实体实例内部变量的tick方法
但是当我在它应该被上面的代码编辑之后尝试使用实例时,它仍然保留它的默认值......
c++ - C++ 引用包装器作为函数参数
据我了解,引用包装器只是引用的包装器,没什么特别的。但是为什么当作为函数参数传递时它被视为函数内部的引用本身(而不是包装器)?
为什么 ref(x) 在函数调用中被视为 x 本身?我遇到这个问题是因为我试图了解在不同线程之间传递数据时 ref() 的使用。我认为 ref() 是必要的,因此任何带有 '&' 的函数参数都不需要重写以避免线程相互干扰。但是为什么线程可以在不使用 x.get() 的情况下将 ref(x) 视为 x 呢?
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 的右值引用)。我在这里想念什么?