问题标签 [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.

0 投票
1 回答
364 浏览

c++ - 具有移动操作和右值转发的对象生命周期

我想知道以下代码是否有效。
特别是,在调用 new_S 之后,我对这里涉及的对象的生命周期感到困惑。
据我了解, T 将在处理初始化列表时被复制,并且可能在向量移动构造函数中。
RValue 向量呢?从 new_S 返回后它仍然有效吗?我会说不,但我绝对不确定

0 投票
3 回答
1660 浏览

c++ - 位域的完美转发解决方法

我正在为 template 的重载解析中寻找位域的解决方法。

我有一个函数,我模板化了它的参数的完美转发:

如果我尝试将它与位域参数一起使用,如下所示:

…它无法编译:

有没有一种方法可以重载f(),使其按值获取位字段,但在常见情况下仍通过引用获取其他参数?

到目前为止,我一直无法。例如,如果我添加一个按值接受参数的重载……</p>

0 投票
1 回答
123 浏览

groovy - Groovy:完美转发

我想做一个闭包,比如说print_args,它需要另一个闭包,比如说f,打印它的参数而不是将参数传递给f.

我对此的第一次尝试如下:

所以,如果我们也定义:

然后我们可以这样做:

可以看出,print_args_add它只是一个闭包,它会add打印它的参数。

我们还可以定义sum

同样:

这适用于传递arrayLists。但是,在传递普通数组时:

工作正常,但以下内容:

中断,因为闭包print_args扩展了传递的数组而不是按原样传递它。

有没有一种我可以编写的方法print_args,它可以处理f可以作为参数传递单个数组的闭包,而不会对调用者施加附加约束或闭包print_args可以处理什么?

我已将代码放在 ideone here上。

0 投票
1 回答
159 浏览

c++ - static_cast 的参数转发

假设我不喜欢static_cast运算符的名称,并且想将其包装在具有不同名称的函数中,例如fancy_static_cast但完美地保留语义。我该怎么做?更具体地说static_cast,是通过价值还是通过引用接受它的论点?还是取决于参数表达式?我应该提供几个重载还是这样的东西可以解决问题?

0 投票
1 回答
865 浏览

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 用法!!!

0 投票
1 回答
649 浏览

c++ - C++ 隐式复制和移动构造函数背后的基本原理?

我对 c++ 隐式复制构造函数的理解类似于

移动构造函数,复制和移动赋值也遵循类似的模式。

为什么没有类似下面的定义?

例子

我有一个具有隐式复制/移动构造函数/赋值运算符的类,以及一些转换构造函数。我正在将这项工作委托给某个实现类。

这很好,因为work1复制/移动构造函数正在为 调用复制/移动构造函数common_work,并且转发构造函数被其他构造函数使用[代码中未显示],这些构造函数从另一种work.

然后我想work1common_workEBO 和其他原因继承。所以新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> > > >. 否则,我必须手动为基类手动编写复制/移动构造函数/赋值work1static_cast这是错误的、容易出错的和维护风险。
0 投票
1 回答
191 浏览

c++ - 具有通用参考/完美转发的 Boost.python?

我一直在尝试使用 C++11 通用引用并在某些类中完美转发,这些类也需要使用 Boost.Python 从 Python 访问。我有有效的代码,但它需要在类之外进行一些丑陋的模板专业化。有没有人以更优雅的方式解决了这个问题?有人对改进以下代码有任何建议吗?

0 投票
0 回答
253 浏览

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。

在测试中,这段代码似乎“工作”:

是否有任何重要的角落案例不包括在内?

0 投票
1 回答
175 浏览

c++ - 作为左值引用或右值副本的数据成员

考虑以下结构模板:

其中 T 将是左值引用(例如const int&)或常规值(例如int)。这个想法是在从左值X构造时使用左值引用,在从右值构造时使用常规值。

因此,定义了以下工厂函数来创建X具有此类属性的实例:

到现在为止还挺好。如果我们现在考虑结构模板Y

我们决定和之前做同样的类比X,我们最终得到了这四个工厂函数:

是否有另一种方法可以获得相同的结果,也许不那么冗长?幸运的是,我的应用程序需要的模板数据成员不超过两个,但需要其他几个类似的类Y,每个类都需要四个工厂函数。

0 投票
1 回答
645 浏览

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)。