问题标签 [forwarding-reference]

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 投票
4 回答
280 浏览

c++ - 为什么 T const&& 不是转发参考?

在模板的上下文中,应用了以下“引用折叠”规则:

为什么该语言禁止“通用引用”具有const限定词?

如果类型已解析为引用(4 个案例中的 3 个),这似乎是有道理的。

我确信这个想法与该语言的其他一些设计方面不兼容,但我不能完全看到完整的画面。

0 投票
4 回答
1779 浏览

c++ - 将相同的值转发给两个或多个函数

使用转发引用时,将相同的值转发给多个函数是不是一个坏主意?考虑以下代码:

如果Container是左值引用,则该函数可以正常工作。但是,我担心将右值传递给它的情况,因为一旦发生移动,该值就会失效。我的疑问是:在这种情况下是否有正确的方法来转发容器,而不会丢失值类别?

0 投票
2 回答
21525 浏览

c++ - 通用引用和转发引用之间有区别吗?

此函数的参数将绑定到右值引用:

但是,此函数的参数将绑定到右值或左值引用:

我经常听到这被称为通用参考。
我也听说它被称为转发参考。
他们的意思是一样的吗?
如果函数体调用,它只是一个转发引用std::forward吗?

0 投票
3 回答
3682 浏览

c++ - 这是转发参考吗?

在 Scott Meyers 的这个例子中,右值引用和转发引用之间的区别已经很清楚了:

本质上,当我们有一个可推导的 context时,就会发生区别,因此案例 (3) 明确指出我们有一个vector<...>&&,而T案例 (4) 将被推导并且(在应用参考折叠规则之后)按照“值类别”进行分类。

但是更复杂的模式匹配会发生什么?以以下案例为例:

这里是什么&&意思?

0 投票
1 回答
183 浏览

c++ - 转发具有明确类型的引用行为

假设我有一个模板类

我知道在这种情况下Args&&...是右值引用,我也可以写得很好,std::move而不是std::forward.

我也可以有一个带有左值引用的构造函数,就像这样

问题是是否可以获得与转发引用相同的行为,但对于明确的类型?我想要这个的原因是我可以使用类似的语法

如果我定义了foo(Args&&... args)构造函数,这可以工作,但不允许混合场景,我想用大括号括起来的初始化列表初始化一些成员元组元素,并从预先存在的对象实例复制其他元素。

0 投票
0 回答
114 浏览

c++ - 转发右值有什么用?

我正在阅读cppreferencestd::forward中的条目。

对于 的第二个重载std::forward,有一个例子:

的类型arg可能在哪里

但是forward<T>(arg).get()是左值还是右值可以不用使用来区分std::forward(如果wrapper引用的参数arg是左值,forward<T>(arg).get()就是左值;否则就是右值)。以下程序是一个支持:

运行结果

那么外层有什么用std::forward呢?

0 投票
1 回答
557 浏览

c++ - 将一组转发引用包装在一个元组中

我有这样的功能

我需要在最后添加一个带有默认参数的额外参数。由于包需要放在最后,我正在考虑将功能更改为

问题是,在 a 中传递参数的最佳方式是什么tuplestd::tuple<Args&&...>我的理解是,Args不再转发引用,而是严格的右值引用。如何获得args包裹在 a 中的转发引用行为tuple,例如接受 anstd::forward_as_tuple并保留单个元组元素的引用类型。另外,在这里传递元组的最佳方式是什么,

或者

或者

?

我是否需要std::forward在函数内部的元组元素上使用,或者只是std::get它们?

0 投票
4 回答
1489 浏览

c++ - 为什么转发引用需要 std::forward

在这样的函数模板中

如果用右值引用调用,x内部不是右值引用吗?如果 foo 使用左值引用调用,则无论如何都不需要强制转换,因为它也将是. 也将被推导出为左值引用类型,因此不会改变.foofooxfooTstd::forward<T>x

我进行了一项测试,使用boost::typeindex和不使用std::forward<T>.

g++ -Wall test.cc && ./a.outwithgcc 6.2.0和的输出boost 1.62.0

编辑:我找到了这个答案:https ://stackoverflow.com/a/27409428/2640636显然,

只要你给参数一个名字,它就是一个左值。

那么我的问题是,为什么选择这种行为而不是将右值引用保留为右值,即使它们被赋予了名称?在我看来,整个转发考验可以通过这种方式规避。

Edit2:我不是在问什么 std::forward。我在问为什么需要它。

0 投票
1 回答
952 浏览

c++ - 为什么在这种情况下转发参考不起作用?

main.cpp(21,6):注意:候选模板被忽略:替换失败 [with T= > std::vector<int, std::allocator<int> > &]:类型“ std::vector<int, std::allocator<int> > &”不能在“ ::”之前使用,因为它没有成员

void f3(T&&)

我的编译器是clang 4.0。

令我惊讶的是,f3(coll)失败了,而f1(coll)两者f2(coll)都还可以。

为什么在这种情况下转发引用不起作用?

0 投票
2 回答
119 浏览

c++ - 当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

T&&是转发引用类型,所以我认为decltype(a)应该是int&而且decltype(b)应该是int&&

但是,上面的代码会产生以下错误:

main.cpp(13,2): 错误:没有匹配的函数来调用 'f' f(n, std::move(n));

main.cpp(7,6):注意:候选模板被忽略:推断参数“T”的冲突类型(“int &”与“int”)

无效 f(T&& a, T&& b)

产生 1 个错误。

当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

我的编译器是clang 4.0。