问题标签 [perfect-forwarding]
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++ - 具有移动操作和右值转发的对象生命周期
我想知道以下代码是否有效。
特别是,在调用 new_S 之后,我对这里涉及的对象的生命周期感到困惑。
据我了解, T 将在处理初始化列表时被复制,并且可能在向量移动构造函数中。
RValue 向量呢?从 new_S 返回后它仍然有效吗?我会说不,但我绝对不确定
c++ - 位域的完美转发解决方法
我正在为 template 的重载解析中寻找位域的解决方法。
我有一个函数,我模板化了它的参数的完美转发:
如果我尝试将它与位域参数一起使用,如下所示:
…它无法编译:
有没有一种方法可以重载f()
,使其按值获取位字段,但在常见情况下仍通过引用获取其他参数?
到目前为止,我一直无法。例如,如果我添加一个按值接受参数的重载……</p>
groovy - Groovy:完美转发
我想做一个闭包,比如说print_args
,它需要另一个闭包,比如说f
,打印它的参数而不是将参数传递给f
.
我对此的第一次尝试如下:
所以,如果我们也定义:
然后我们可以这样做:
可以看出,print_args_add
它只是一个闭包,它会add
打印它的参数。
我们还可以定义sum
:
同样:
这适用于传递arrayList
s。但是,在传递普通数组时:
工作正常,但以下内容:
中断,因为闭包print_args
扩展了传递的数组而不是按原样传递它。
有没有一种我可以编写的方法print_args
,它可以处理f
可以作为参数传递单个数组的闭包,而不会对调用者施加附加约束或闭包print_args
可以处理什么?
我已将代码放在 ideone here上。
c++ - static_cast 的参数转发
假设我不喜欢static_cast
运算符的名称,并且想将其包装在具有不同名称的函数中,例如fancy_static_cast
但完美地保留语义。我该怎么做?更具体地说static_cast
,是通过价值还是通过引用接受它的论点?还是取决于参数表达式?我应该提供几个重载还是这样的东西可以解决问题?
c++ - 模板和非模板函数中的 std::forward 测试
我有以下代码直接来自: http ://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html
在 g++ 4.8.1 编译为: g++ -std=c++11 testforward.cpp -o testforward.exe
据作者描述如下:
当你将右值引用与函数模板结合起来时,你会得到一个有趣的交互:如果函数参数的类型是对模板类型参数的右值引用,那么如果传递了左值,则类型参数被推断为左值引用,而普通的否则键入...
该测试的结果输出是:
f(x) get "t in g is lvalue" 和预期的一样!!
f(X()) 得到 "t in g is rvalue" ,是的,这就是 std::forward 的用途
h(X()) get "t in g is lvalue",这是我的问题,你可以看到函数 h 不是模板函数,正如作者所描述的“当你将右值引用与函数模板结合起来时,你会得到一个有趣的交互”不是这种情况,这个函数仍然输出“t in g is lvalue”,这意味着这个有趣的交互不仅发生在模板函数中,也发生在正常函数中!!
如果我将代码更改为:
我会得到“t in g is rvalue”!!!
根据测试,我可以说作者描述“当你将右值引用与函数模板结合起来时,你会得到一个有趣的交互”实际上不仅适用于模板函数,它也适用于普通函数,或者我的英语不好,所以我可以没听懂这个描述吧?!
编辑 :
看起来只有在模板函数中,我会得到 std::forward 的 cprrect 用法!!!
c++ - C++ 隐式复制和移动构造函数背后的基本原理?
我对 c++ 隐式复制构造函数的理解类似于
移动构造函数,复制和移动赋值也遵循类似的模式。
为什么没有类似下面的定义?
例子
我有一个具有隐式复制/移动构造函数/赋值运算符的类,以及一些转换构造函数。我正在将这项工作委托给某个实现类。
这很好,因为work1
复制/移动构造函数正在为 调用复制/移动构造函数common_work
,并且转发构造函数被其他构造函数使用[代码中未显示],这些构造函数从另一种work
.
然后我想work1
从common_work
EBO 和其他原因继承。所以新work1
班级看起来像
但是,作为work1
一个work_like
类,转发构造函数突然有了更好的匹配,因为复制/移动构造函数common_work
需要static_cast
从派生到基。
笔记 :
- Scott Meyers给出了类似的示例,其中复制构造触发转发构造函数,因为复制构造函数需要 const 添加,而转发构造函数不需要。但我认为,这个问题是由于错误的类设计引起的,而这里的问题是由于在隐式复制/移动期间传递给基类的参数不完全匹配。
- 我不能编写通用转发构造函数/赋值,并删除隐式的,因为删除的函数也参与重载决议,如果完全匹配会导致错误。
- 目前我的解决方案是制作
common_work
为 CRTP ,即作为模板参数传递的派生类类型,并在转发构造函数中将其过滤为enable_if<and_<work_like<T>,not_<is_same<T,Derived> > > >
. 否则,我必须手动为基类手动编写复制/移动构造函数/赋值work1
,static_cast
这是错误的、容易出错的和维护风险。
c++ - 具有通用参考/完美转发的 Boost.python?
我一直在尝试使用 C++11 通用引用并在某些类中完美转发,这些类也需要使用 Boost.Python 从 Python 访问。我有有效的代码,但它需要在类之外进行一些丑陋的模板专业化。有没有人以更优雅的方式解决了这个问题?有人对改进以下代码有任何建议吗?
c++ - unique_ptr 实现的 C++03 转发解决方法
我正在开发一个 C++03 项目,该项目需要借助 Boost.Move/其他 Boost 库来转发语义。该项目的目标是以向前兼容的方式向 C++11 提供 unique_ptr。
C++11 标准需要以下构造函数:
它从 u 传输存储的数据(基本上是 ptr_val = u.release()),并将:
- 如果 E 是引用类型,将 u 的删除器复制到 *this。
- 否则,将 u 的删除器移动到 *this。
在测试中,这段代码似乎“工作”:
是否有任何重要的角落案例不包括在内?
c++ - 作为左值引用或右值副本的数据成员
考虑以下结构模板:
其中 T 将是左值引用(例如const int&
)或常规值(例如int
)。这个想法是在从左值X
构造时使用左值引用,在从右值构造时使用常规值。
因此,定义了以下工厂函数来创建X
具有此类属性的实例:
到现在为止还挺好。如果我们现在考虑结构模板Y
:
我们决定和之前做同样的类比X
,我们最终得到了这四个工厂函数:
是否有另一种方法可以获得相同的结果,也许不那么冗长?幸运的是,我的应用程序需要的模板数据成员不超过两个,但需要其他几个类似的类Y
,每个类都需要四个工厂函数。
c++ - 转发元组的一个元素
考虑以下代码:
我想找出正确的语法/* Something1 */
和/* Something2 */
为了转发由Index
输入指定的元素tuple
。我知道可以使用其他概念/语法,但是为了正确理解事物在这种情况下的工作方式(将其视为学术练习),我想要一个满足以下条件的答案:
- 不同情况下没有重载:只有一个模板化函数
forward
- 除了
/* Something1 */
and没有变化/* Something2 */
_Type&&
Type
- 元编程的疯狂,
decltype
并被std::declval
接受
例如,如果Tuple = std::tuple<char, int, double>
,forward<2>(tuple)
则应转发第三个元素(如果元组作为 const 引用传递,则函数应返回对 的 const 引用double
)。