问题标签 [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++ - 右值引用和完美转发
我读过几篇关于 && 的论文,我只是好奇是否有:
或者只是通过'r'就足够了?
c++ - make_unique 和完美的转发
std::make_unique
为什么标准 C++11 库中没有函数模板?我发现
有点冗长。下面的不是更好吗?
这new
很好地隐藏了类型,并且只提到了一次类型。
无论如何,这是我尝试实现的make_unique
:
我花了很std::forward
长时间来编译这些东西,但我不确定它是否正确。是吗?究竟是什么std::forward<Args>(args)...
意思?编译器对此有何看法?
variadic-functions - 将可变参数宏转换为可变参数模板函数?
给定以下形式的可变参数宏:
——如何将其重写为可变参数函数模板?
更新:我对如何声明Args
:&&
或const&
什么的引用类型特别感兴趣?
更新:请注意,FType 应该是一个“普通”函数指针。
c++ - 结合两个复制和移动的构造函数
目前,我的玩具类模板之一有两个看起来非常相似的构造函数:
我可以将它们组合成一个构造函数模板,还是会以某种方式改变语义?
c++ - C++ 统一赋值运算符移动语义
编辑:已解决见评论——不知道如何在没有答案的情况下标记为已解决。
在观看了有关 C++0x 中的完美转发/移动语义的第 9 频道视频后,我有些相信这是编写新赋值运算符的好方法。
这应该允许将 r 值和 const& s 分配给它。通过使用适当的构造函数构造一个新对象,然后用 *this 交换内容。这对我来说似乎是合理的,因为没有数据被复制超过它需要的。指针算法很便宜。
但是我的编译器不同意。(g++ 4.6) 我得到了这些错误。
难道我做错了什么?这是不好的做法(我认为没有办法测试你是否是自我分配的)?编译器还没有准备好?
谢谢
d - D中的完美转发?
tl; dr:你如何在 D 中进行完美转发?
该链接有一个很好的解释,但例如,假设我有这个方法:
如何创建另一个方法,bar()
可以代替foo()
调用,随后foo()
“完美”调用(即在调用站点不引入编译/范围/等问题)?
天真的方法
当然不起作用,因为它不处理ref
, in
, out
, inout
,const
方法的 -ness , pure
-ity,nothrow
等......并且它还限制了值如何与 r 值一起使用。
而且我不知道如何处理这些可能的情况......有什么想法吗?
c++ - 我如何制作一个允许所有 l-value ref、r-value ref 和 initializer_list 的模板化构造函数?
我正在尝试设计一个具有两个大序列向量的类。
好吧,它工作得很好,但它不使用向量的移动构造函数。因此,我尝试更改构造函数以接受具有完美转发的 r 值引用。
现在我遇到了一个问题。当我尝试使用 initializer_list 构造实例时,出现这样的错误。
我认为这std::initializer_list<double>
可能无法转换为std::vector<double>
,但它实际上是可转换的,当我尝试不使用 enable_if 参数时遇到了同样的错误。我错过了什么吗?
c++ - 完美转发和 std::tuple (或其他模板类)
我在完美转发方面遇到了一些困难。
这是我目前的理解水平:胶水模板 + 右值引用 + std::forward 和一个特殊的神奇模式被激活,其中模板推导规则的含义与往常不同,但经过精心设计以允许完美转发。例子 :
但是如果 T 实际上是一个模板类会发生什么呢?例如,如何完善转发 std::tuple ?如果使用 T&& 作为 aboce,我将丢失元组中包含的对象的所有类型信息。
但是以下代码不起作用:
最后的 gcc 快照说:
很明显,我们仍然处于一般的、非模板的情况下,左值不能绑定到右值引用。“完美转发模式”未激活
所以我试图偷偷摸摸地将我的元组作为模板模板传递:
但我仍然得到同样的错误。
c++ - 为什么`const int ci = 2; 标准::转发(ci);` 工作以及如何修复/解决它?
简单的问题,为什么以下工作不起作用(暗示 的副本ci
)?
prog.cpp:在函数'int main()'中:
prog.cpp:6:23:错误:没有匹配函数调用'forward(const int&)'
在编写一些模板内容时,问题就表现出来了,我有一个简单的持有人类型,如下所示。为了避免不必要的复制,我尽可能使用完美转发,但这似乎是问题的根源。
如果需要任何进一步的信息,请告诉我。
非常感谢任何解决此问题的想法。
c++ - 为什么一个完美的转发功能必须模板化?
为什么以下代码有效:
但不是:
为什么示例 2 中的左值没有以与示例 1 中相同的方式解析?
此外,为什么标准认为需要在 std::forward 中提供参数类型而不是简单地推导它很重要?简单地向前呼叫表示意图,无论类型如何。
如果这不是标准的东西而只是我的编译器,我正在使用 msvc10,这将解释糟糕的 C++11 支持。
谢谢
编辑 1:将文字“Hello World”更改为 std::string("Hello World") 以生成右值。