问题标签 [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.
c++ - 为什么 T const&& 不是转发参考?
在模板的上下文中,应用了以下“引用折叠”规则:
为什么该语言禁止“通用引用”具有const
限定词?
如果类型已解析为引用(4 个案例中的 3 个),这似乎是有道理的。
我确信这个想法与该语言的其他一些设计方面不兼容,但我不能完全看到完整的画面。
c++ - 将相同的值转发给两个或多个函数
使用转发引用时,将相同的值转发给多个函数是不是一个坏主意?考虑以下代码:
如果Container
是左值引用,则该函数可以正常工作。但是,我担心将右值传递给它的情况,因为一旦发生移动,该值就会失效。我的疑问是:在这种情况下是否有正确的方法来转发容器,而不会丢失值类别?
c++ - 通用引用和转发引用之间有区别吗?
此函数的参数将绑定到右值引用:
但是,此函数的参数将绑定到右值或左值引用:
我经常听到这被称为通用参考。
我也听说它被称为转发参考。
他们的意思是一样的吗?
如果函数体调用,它只是一个转发引用std::forward
吗?
c++ - 这是转发参考吗?
在 Scott Meyers 的这个例子中,右值引用和转发引用之间的区别已经很清楚了:
本质上,当我们有一个可推导的 context时,就会发生区别,因此案例 (3) 明确指出我们有一个vector<...>&&
,而T
案例 (4) 将被推导并且(在应用参考折叠规则之后)按照“值类别”进行分类。
但是更复杂的模式匹配会发生什么?以以下案例为例:
这里是什么&&
意思?
c++ - 转发具有明确类型的引用行为
假设我有一个模板类
我知道在这种情况下Args&&...
是右值引用,我也可以写得很好,std::move
而不是std::forward
.
我也可以有一个带有左值引用的构造函数,就像这样
问题是是否可以获得与转发引用相同的行为,但对于明确的类型?我想要这个的原因是我可以使用类似的语法
如果我定义了foo(Args&&... args)
构造函数,这可以工作,但不允许混合场景,我想用大括号括起来的初始化列表初始化一些成员元组元素,并从预先存在的对象实例复制其他元素。
c++ - 转发右值有什么用?
我正在阅读cppreferencestd::forward
中的条目。
对于 的第二个重载std::forward
,有一个例子:
的类型
arg
可能在哪里
但是forward<T>(arg).get()
是左值还是右值可以不用使用来区分std::forward
(如果wrapper
引用的参数arg
是左值,forward<T>(arg).get()
就是左值;否则就是右值)。以下程序是一个支持:
那么外层有什么用std::forward
呢?
c++ - 将一组转发引用包装在一个元组中
我有这样的功能
我需要在最后添加一个带有默认参数的额外参数。由于包需要放在最后,我正在考虑将功能更改为
问题是,在 a 中传递参数的最佳方式是什么tuple
。std::tuple<Args&&...>
我的理解是,Args
不再转发引用,而是严格的右值引用。如何获得args
包裹在 a 中的转发引用行为tuple
,例如接受 anstd::forward_as_tuple
并保留单个元组元素的引用类型。另外,在这里传递元组的最佳方式是什么,
或者
或者
?
我是否需要std::forward
在函数内部的元组元素上使用,或者只是std::get
它们?
c++ - 为什么转发引用需要 std::forward
在这样的函数模板中
如果用右值引用调用,x
内部不是右值引用吗?如果 foo 使用左值引用调用,则无论如何都不需要强制转换,因为它也将是. 也将被推导出为左值引用类型,因此不会改变.foo
foo
x
foo
T
std::forward<T>
x
我进行了一项测试,使用boost::typeindex
和不使用std::forward<T>
.
g++ -Wall test.cc && ./a.out
withgcc 6.2.0
和的输出boost 1.62.0
是
编辑:我找到了这个答案:https ://stackoverflow.com/a/27409428/2640636显然,
只要你给参数一个名字,它就是一个左值。
那么我的问题是,为什么选择这种行为而不是将右值引用保留为右值,即使它们被赋予了名称?在我看来,整个转发考验可以通过这种方式规避。
Edit2:我不是在问什么 std::forward
。我在问为什么需要它。
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)
都还可以。
为什么在这种情况下转发引用不起作用?
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。