问题标签 [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 回答
8752 浏览

c++ - 如何结合 std::bind()、可变参数模板和完美转发?

我想通过第三方函数调用另一个方法;但两者都使用可变参数模板。例如:

问题是,我得到一个编译错误:

我尝试使用 lambda,但也许GCC 4.8 还没有处理语法;这是我尝试过的:

我收到以下错误:

据我了解,编译器希望invoke_impl使用 type进行实例化int&&,而我认为&&在这种情况下使用会保留实际的参数类型。

我究竟做错了什么?谢谢,

0 投票
3 回答
106 浏览

c++ - 如何保存静态可选值

考虑一个封装了其他函数但在封装调用之后执行某些操作的函数。

如何扩展它以包装返回的函数void?添加另一个专业很容易,但我正在寻找另一种可能是惯用的方式。

一般的想法是可能有也可能没有价值。这就像 compile-time optional

0 投票
1 回答
409 浏览

c++11 - D 中的就职

D 有类似于 C++11 的东西emplace_back()吗?当我将单个或多个结构附加到数组或其他具有其成员的值语义的 D 容器的末尾时,我通常想要这个?

更新:我想这是正确的答案?: http: //dlang.org/phobos/std_conv.html#.emplace

我仍然认为它与质疑 emplace 的需求有关,因为 D 对内存有更严格的控制 - 在上面提到的情况下,是否可以通过巧妙的编译器优化来淘汰对 emplace 的需求?

0 投票
2 回答
1009 浏览

c++ - 为什么我们需要参考折叠规则

大家可能都知道,我们使用右值引用结合引用折叠规则来构建完美的转发函数,像这样

参考折叠规则就像

因此,在我的示例f中,Tisint&&T&&isint&& &&折叠为int&&.

T我的问题是,如果已经推导出来,为什么我们需要这些规则int&&?为什么会

变成void f(int)而不是void f(int&&)if Tis int&&? 如果Tis really intand T&&is 是什么使它成为int&&and 因此void f(int&&),那么为什么我们需要参考折叠规则,因为它们似乎从未应用过?根据我有限的知识,我只能说出这两个选项,所以显然有一条我不知道的规则。

查看标准中关于此的引用也会有所帮助。

0 投票
2 回答
2141 浏览

c++ - 对输入参数进行多次传递的完美转发

考虑以下函数,该函数accept采用类型的“通用引用”T并将其转发到具有parse<T>()左值重载和右值重载的函数对象:

由于完美转发使源对象处于有效但未定义的状态,因此不可能在同一范围内再次完美转发。split()下面我尝试在一个假设函数中拥有尽可能少的副本,该函数采用int表示必须对输入数据进行的传递次数:

问题:这是对同一数据的多次传递应用完美转发的推荐方法吗?如果不是,那么最小化副本数量的更惯用方法是什么?

0 投票
1 回答
429 浏览

c++ - 将可变参数模板参数转发给几个类成员

以下安全吗?第一个类成员初始化后不会std::string被调用吗?move打印出来没问题,但我不确定。

我想这没关系,因为 is 的第三个 ctor 参数Cconst std::string&但是我如何防止在一个采用 r 值 ref 的类中完美转发,例如C(int, int, std::string&&),因为 thenm_two不会收到与 相同的 ctor args m_one

将 Test 的 ctor 更改为

不编译。也不会删除std::forward<Args>(args)...fromm_onem_twoctors。

0 投票
2 回答
3199 浏览

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吗?有什么理由避免它吗?如果是这样,首选的选择是什么?

0 投票
1 回答
2982 浏览

c++ - 为什么我不能从一对中返回 unique_ptr?

为什么我不能从一对中返回 unique_ptr?

当我尝试用 g++ 4.6 编译它时,我得到:

我不明白错误信息

0 投票
0 回答
97 浏览

c++ - std::forward 如何知道引用是左值还是右值?

来自http://www.cplusplus.com/reference/utility/forward/?kw=forward的实用程序 std::forward 示例似乎有点像魔术。它如何知道调用函数的参数是左值还是右值?这是由编译器还是在运行时确定的?我认为这里有一些我不明白的地方,但我不知道我是否足够了解以正确地提出问题。有人可以解释一下 std::forward 在“幕后”做了什么。

0 投票
2 回答
145 浏览

c++ - std::forward 在参数传递中的用途是什么?

请参阅下面的代码段(注意 s 是一个带有 char 而不是字符串的数组):

如果我替换func(s, ':')using std::forward,则没有区别,std::forward在这种情况下, foo 函数将执行完美转发。

std::forward在 C++11 中是否存在对“完美转发”的误解?