问题标签 [forwarding-reference]

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 回答
1032 浏览

c++ - C++11完美转发和引用折叠

考虑这段代码:

我的问题是,如果可以推断出通用引用类型,为什么我还需要调用 forward ?
为什么不转发 tmp 的正确 c'tor 即使推导出 T 的类型也不会被调用。

我的第二个问题是关于参考折叠规则:

  1. A& &&变成A&
  2. A&& &&变成A&&

所以根据这个规则并考虑到通用参考为什么 std::forward 签名不能如下:

根据上面的规则,如果T's 的类型是右值引用,它将折叠为右值引用,如果 T 的类型是左值引用,它将折叠为左值引用。
那么为什么std::forward有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?

0 投票
1 回答
904 浏览

c++ - 错误 C2783:“_Ty &&std::forward(remove_reference<_Ty>::type &&) throw()”:无法推断“_Ty”的模板参数

我有一个并发队列的模板化实现,它具有如下所示的推送功能:

稍后,我实例化它并像这样使用它:

然后我尝试将项目推送到队列中,并得到上述编译器错误:

我之前成功地将队列用作存储std::function对象的线程池实现的一部分。我不明白为什么在这种情况下它不能推断出类型。有什么想法吗?

0 投票
1 回答
108 浏览

c++ - 等效的 static_asserts 给出了 is_array<> 的冲突结果

在下面的代码片段中,一个静态断言通过而另一个失败:

提示:删除注释以调试类型(正确推断为int [5])。

为什么是这样?在铿锵的树干上测试。

我猜这与数组衰减为指针有关......不知何故。

解决方案:使用std::remove_reference_t, Rngwill be int (&)[5],这是对数组的引用,而不是数组。

Xeo 补充说:

将无法编译并显示r.

产生了一个错误的int**** j = r;错误(说 can't assing int[5]to int****)。

0 投票
1 回答
69 浏览

c++ - void foo(T && param)中的通用引用

0 投票
1 回答
277 浏览

c++ - 条件类型特征通用参考的问题

所以我有一个函数用于检查值并在值无效时抛出异常,否则在收到值时将其传回。我试图用普遍的敬意和类型特征来概括这个例程。我觉得我很接近,因为我的例子在某些情况下有效,但不是全部。它似乎只适用于右值。

产生输出

如果我取消注释最后一行,我会收到以下错误:

这似乎has_empty<T>::value正在评估false。我确信我可以做一些不同的工作来让它发挥作用,所以在这一点上它是一种学术性的。尽管如此,任何帮助将不胜感激。

0 投票
2 回答
690 浏览

c++ - 为什么 std::move 需要前向引用?

的实现std::move基本上是这样的:

请注意,参数ofstd::move是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move同时使用左值和右值:

但是既然整个点std::move是转换为右值,为什么我们甚至允许右值std::move呢?std::move如果只接受左值不是更有意义吗?

那么无意义的表达式std::move(b + c)会导致编译时错误。

对于初学者来说,上面的实现std::move也更容易理解,因为代码完全按照它的样子做:它接受一个左值并返回一个右值。您不必了解通用引用、引用折叠和元函数。

那么为什么std::move设计为同时采用左值和右值呢?

0 投票
3 回答
380 浏览

c++ - 精简版概念将如何与通用参考进行交互?

我最近看了这个视频,解释了 C++ 中精简概念的想法,今年可能会以 TS 的形式出现。现在,我还了解了通用引用/转发引用(如此所述),并且 T&& 可以根据上下文有两种含义(即是否正在执行类型推导)。这自然会引出一个问题,概念将如何与通用引用相互作用?

具体来说,在下面的例子中,我们有

但是如果我们使用概念会发生什么?

尤其是最后一个例子让我有点困扰,因为有两个相互冲突的原则。首先,以这种方式使用的概念应该像类型一样工作,其次,如果 T 是推导类型,则 T&& 表示通用引用而不是右值引用。

提前感谢您对此的澄清!

0 投票
2 回答
418 浏览

c++ - 身份别名模板可以作为转发参考吗?

考虑下面的代码片段:

i是一个左值,因此如果foo声明一个转发引用参数,它应该编译。但是,如果identity<T>&&变成 be int&&,它应该会引发错误。

该代码在 GCC 6.0.0 ( demo )中编译。

该代码无法在 Clang 3.7.0 ( demo ) 中编译并显示错误消息:

哪一个是对的?

0 投票
1 回答
192 浏览

c++ - 转发引用可以用别名模板来别名吗?

这是我之前问题的延续:

身份别名模板可以作为转发参考吗?

以下代码似乎在 Clang 3.7.0 ( demo ) 和 GCC 6.0.0 ( demo ) 中都有效:

编译器是否有权将别名模板替换为转发引用,这可能是一种奇特的编写方式?

0 投票
1 回答
3433 浏览

c++ - 我应该什么时候 std::forward 函数调用?

我在Effective Modern C++中看到的一个代码片段巧妙地实现了创建函数 timer的检测原理

我的问题是关于std::forward<decltype(func)>(func)(...

  • 据我了解,我们实际上是将函数转换为其原始类型,但为什么需要这样做呢?看起来一个简单的调用就可以解决问题。
  • 还有其他情况我们使用完美转发来进行函数调用吗?

如果我们想让计时器类型成为编译时间常数,这看起来像是在 lambda 表达式中使用熟悉的模板语法的一个很好的用例。