问题标签 [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++ - std::forward 和带有非常量引用参数的构造函数
在A Brief Introduction to Rvalue References中,提出了完美转发作为将 rvalue 5 转发到具有非常量引用参数的构造函数的理想解决方案。
但:
XCode 4.2 ans G++ 4.6.1 with 失败no known conversion from int to int&
,而:
编译。我做错了什么?
c++ - 完美转发对象成员
假设我有两个struct
s:
我有功能:
如何编写一个函数,分别g()
采用Y&
orY&&
但完美转发X&
or :X&&
f()
上面的代码说明了我的意图,但随着参数数量的增加,它的可扩展性并不高。有没有办法让它完美转发并使其可扩展?
c++ - 转发参数
我有一个形式的构造:
但由于某种原因,我无法转发这些论点。有没有办法做到这一点?
我正在使用 gcc 4.6.1。
c++ - 如何为类似元组的可变参数类创建完美的转发构造函数
我正在尝试创建类似于元组的东西,但是在编写构造函数时遇到了问题。
这是代码:
现在,如果将简单类型作为初始化程序传递,这可以正常工作,但如果我尝试在大括号封闭的初始化程序列表中为非平凡对象传递参数,则不会。
GCC-4.7 发出以下内容:
Clang-3.1 如下:
好的,现在让我非常非常好奇的是它适用于元组!根据标准(20.4.2.1),它有一个构造函数,看起来很像我的。
以同样的方式构造元组对象时,它可以工作!
现在我想知道:
A) 什么鬼?为什么 std::tuple 如此特别,为什么编译器不推断出正确数量的参数?
B)我怎样才能使这项工作?
c++ - 基于范围的声明的正确样式
这个问题提到了 C++11 基于范围的明显的惯用用法。
不过,我一直对您应该使用的参考类型表示怀疑。输入迭代器可能返回右值。尽管auto
可以推断出由 引入的隐式类型const
将绑定到右值,但这似乎没有发生。
使用完美转发的最佳一般做法是什么?
我认为这里没有缺点,但它看起来有点太可爱了。也许我还没有写足够多的 C++11。
c++ - 统一 const T& 和 T&& 重载
我有以下两个函数模板重载:
我第一次尝试通过完美转发统一重载失败:
就像我的第二次尝试一样:
有没有一种干净的方法来统一重载,还是我应该忍受它们?
c++ - 右值模板参数隐式用作左值,并且 std::forwarding 工作
这个关于用法的例子std::forward
让我感到困惑。这是我编辑的版本:
输出是
以及关于引用的警告,以template_type_dumper
显示在第一个实例化中,decltype(u) = int&&
and U = int
,对于第二个decltype(u) = int&
and U = int&
。
很明显,正如预期的那样,有两种不同的实例化,但她是我的问题:
- 怎么可以
std::forward
在这里工作?在第一个实例化中,它的模板参数是显式的U = int
,它怎么知道它必须返回一个右值引用?如果我U&&
改为指定会发生什么? make_unique
被声明为采用右值引用。怎么会u
是左值引用?有什么我遗漏的特殊规则吗?
c++ - C++11 std::function 和完美转发
为什么 C++ 标准中 std::function<>::operator() 的定义是:
并不是
?
有人会认为,要正确转发参数,我们需要 && ,然后std::forward<ArgTypes>...
在转发调用时在函数体中使用?
我部分重新实现了 std::function 来测试它,我发现如果我使用 &&,当我稍后尝试按值传递参数给 operator() . 我认为我对右值/转发概念有足够的了解,但我仍然无法理解这一点。我错过了什么?
c++ - 重新排序可变参数
我遇到了重新排序提供给结构构造函数的可变参数列表的需要。根据类型重新排序后,参数将存储为元组。我的问题是如何做到这一点,以便现代 C++ 编译器(例如g++-4.7
)不会生成不必要的加载或存储指令。也就是说,当使用可变大小的参数列表调用构造函数时,它会根据参数类型的排序有效地将每个参数推送到位。
这是一个具体的例子。假设每个参数的基本类型(没有引用、右值引用、指针或限定符)是char
、int
或float
。我怎样才能使它char
首先出现所有基本类型的参数,然后是所有基本类型int
的参数(最后留下基本类型的参数float
)。在同类基本类型的子列表中,不应违反给定参数的相对顺序。
示例:foo::foo()
使用 arguments 调用float a, char&& b, const float& c, int&& d, char e
。元组元组是std::tuple<char, char, int, float, float>
,它的构造如下tuple_type{std::move(b), e, std::move(d), a, c}
:
考虑下面定义的结构,并假设元功能deduce_reordered_tuple_type
已经实现。您将如何编写构造函数以使其按预期工作?如果您认为 , 的代码对deduce_reodered_tuple_type
您有用,我可以提供;有点长。
编辑 1 我上面描述的技术确实在数学框架中有应用,这些框架大量使用表达式模板、可变参数模板和元编程来执行积极的内联。假设您希望定义一个运算符,该运算符采用多个表达式的乘积,每个表达式都可以通过引用、对 const 的引用或右值引用传递。(在我的例子中,表达式是条件概率表,运算是因子乘积,但矩阵乘法之类的东西也适用。)
您需要访问每个表达式提供的数据才能评估产品。因此,您必须移动作为右值引用传递的表达式,将通过引用传递的表达式复制到 const,并获取通过引用传递的表达式的地址。使用我上面描述的技术现在带来了几个好处。
- 其他表达式可以使用统一的语法来访问该表达式的数据元素,因为所有繁重的元编程工作都是在类中预先完成的。
- 我们可以通过将指针组合在一起并将较大的表达式存储在元组末尾来节省堆栈空间。
- 实现某些类型的查询变得容易得多(例如检查存储在元组中的任何指针是否为给定指针起别名)。
非常感谢您的帮助!