问题标签 [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::bind()、可变参数模板和完美转发?
我想通过第三方函数调用另一个方法;但两者都使用可变参数模板。例如:
问题是,我得到一个编译错误:
我尝试使用 lambda,但也许GCC 4.8 还没有处理语法;这是我尝试过的:
我收到以下错误:
据我了解,编译器希望invoke_impl
使用 type进行实例化int&&
,而我认为&&
在这种情况下使用会保留实际的参数类型。
我究竟做错了什么?谢谢,
c++ - 如何保存静态可选值
考虑一个封装了其他函数但在封装调用之后执行某些操作的函数。
如何扩展它以包装返回的函数void
?添加另一个专业很容易,但我正在寻找另一种可能是惯用的方式。
一般的想法是可能有也可能没有价值。这就像 compile-time optional
。
c++11 - D 中的就职
D 有类似于 C++11 的东西emplace_back()
吗?当我将单个或多个结构附加到数组或其他具有其成员的值语义的 D 容器的末尾时,我通常想要这个?
更新:我想这是正确的答案?: http: //dlang.org/phobos/std_conv.html#.emplace
我仍然认为它与质疑 emplace 的需求有关,因为 D 对内存有更严格的控制 - 在上面提到的情况下,是否可以通过巧妙的编译器优化来淘汰对 emplace 的需求?
c++ - 为什么我们需要参考折叠规则
大家可能都知道,我们使用右值引用结合引用折叠规则来构建完美的转发函数,像这样
参考折叠规则就像
因此,在我的示例f
中,T
isint&&
和T&&
isint&& &&
折叠为int&&
.
T
我的问题是,如果已经推导出来,为什么我们需要这些规则int&&
?为什么会
变成void f(int)
而不是void f(int&&)
if T
is int&&
? 如果T
is really int
and T&&
is 是什么使它成为int&&
and 因此void f(int&&)
,那么为什么我们需要参考折叠规则,因为它们似乎从未应用过?根据我有限的知识,我只能说出这两个选项,所以显然有一条我不知道的规则。
查看标准中关于此的引用也会有所帮助。
c++ - 对输入参数进行多次传递的完美转发
考虑以下函数,该函数accept
采用类型的“通用引用”T
并将其转发到具有parse<T>()
左值重载和右值重载的函数对象:
由于完美转发使源对象处于有效但未定义的状态,因此不可能在同一范围内再次完美转发。split()
下面我尝试在一个假设函数中拥有尽可能少的副本,该函数采用int
表示必须对输入数据进行的传递次数:
问题:这是对同一数据的多次传递应用完美转发的推荐方法吗?如果不是,那么最小化副本数量的更惯用方法是什么?
c++ - 将可变参数模板参数转发给几个类成员
以下安全吗?第一个类成员初始化后不会std::string
被调用吗?move
打印出来没问题,但我不确定。
我想这没关系,因为 is 的第三个 ctor 参数C
,const std::string&
但是我如何防止在一个采用 r 值 ref 的类中完美转发,例如C(int, int, std::string&&)
,因为 thenm_two
不会收到与 相同的 ctor args m_one
?
将 Test 的 ctor 更改为
不编译。也不会删除std::forward<Args>(args)...
fromm_one
和m_two
ctors。
c++ - std::forward 没有完美转发?
建议std::forward
通常仅限于完美转发函数模板参数的规范用例;一些评论员甚至说这是std::forward
. 但考虑这样的代码:
在这种情况下,不会出现完美转发的问题:因为这是一个类模板而不是函数模板,客户端代码必须明确指定T
,并且可以选择是否以及如何对其进行 ref 限定。同样,参数 tostd::forward
不是“通用参考”。
尽管如此,std::forward
这里似乎很合适:我们不能把它排除在外,因为当它T
是只移动类型时它不起作用,我们不能使用它,因为它在是左值引用类型std::move
时不起作用T
. 当然,我们可以部分专门ValueHolder
针对引用和std::move
值使用直接初始化,但这在std::forward
完成这项工作时似乎过于复杂。这似乎也是一个合理的概念匹配的含义std::forward
:我们试图一般地转发可能是也可能不是引用的东西,只是我们将它转发给函数的调用者,而不是我们调用的函数我们自己。
这是合理的使用std::forward
吗?有什么理由避免它吗?如果是这样,首选的选择是什么?
c++ - 为什么我不能从一对中返回 unique_ptr?
为什么我不能从一对中返回 unique_ptr?
当我尝试用 g++ 4.6 编译它时,我得到:
我不明白错误信息
c++ - std::forward 如何知道引用是左值还是右值?
来自http://www.cplusplus.com/reference/utility/forward/?kw=forward的实用程序 std::forward 示例似乎有点像魔术。它如何知道调用函数的参数是左值还是右值?这是由编译器还是在运行时确定的?我认为这里有一些我不明白的地方,但我不知道我是否足够了解以正确地提出问题。有人可以解释一下 std::forward 在“幕后”做了什么。
c++ - std::forward 在参数传递中的用途是什么?
请参阅下面的代码段(注意 s 是一个带有 char 而不是字符串的数组):
如果我替换func(s, ':')
using std::forward
,则没有区别,std::forward
在这种情况下, foo 函数将执行完美转发。
std::forward
在 C++11 中是否存在对“完美转发”的误解?