问题标签 [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.
c++ - C++11完美转发和引用折叠
考虑这段代码:
我的问题是,如果可以推断出通用引用类型,为什么我还需要调用 forward ?
为什么不转发 tmp 的正确 c'tor 即使推导出 T 的类型也不会被调用。
我的第二个问题是关于参考折叠规则:
A& &&
变成A&
A&& &&
变成A&&
所以根据这个规则并考虑到通用参考为什么 std::forward 签名不能如下:
根据上面的规则,如果T
's 的类型是右值引用,它将折叠为右值引用,如果 T 的类型是左值引用,它将折叠为左值引用。
那么为什么std::forward
有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?
c++ - 错误 C2783:“_Ty &&std::forward(remove_reference<_Ty>::type &&) throw()”:无法推断“_Ty”的模板参数
我有一个并发队列的模板化实现,它具有如下所示的推送功能:
稍后,我实例化它并像这样使用它:
然后我尝试将项目推送到队列中,并得到上述编译器错误:
我之前成功地将队列用作存储std::function
对象的线程池实现的一部分。我不明白为什么在这种情况下它不能推断出类型。有什么想法吗?
c++ - 等效的 static_asserts 给出了 is_array<> 的冲突结果
在下面的代码片段中,一个静态断言通过而另一个失败:
提示:删除注释以调试类型(正确推断为int [5]
)。
为什么是这样?在铿锵的树干上测试。
我猜这与数组衰减为指针有关......不知何故。
解决方案:使用std::remove_reference_t
, Rng
will be int (&)[5]
,这是对数组的引用,而不是数组。
Xeo 补充说:
将无法编译并显示r
.
产生了一个错误的int**** j = r;
错误(说 can't assing int[5]
to int****
)。
c++ - 条件类型特征通用参考的问题
所以我有一个函数用于检查值并在值无效时抛出异常,否则在收到值时将其传回。我试图用普遍的敬意和类型特征来概括这个例程。我觉得我很接近,因为我的例子在某些情况下有效,但不是全部。它似乎只适用于右值。
产生输出
如果我取消注释最后一行,我会收到以下错误:
这似乎has_empty<T>::value
正在评估false
。我确信我可以做一些不同的工作来让它发挥作用,所以在这一点上它是一种学术性的。尽管如此,任何帮助将不胜感激。
c++ - 为什么 std::move 需要前向引用?
的实现std::move
基本上是这样的:
请注意,参数ofstd::move
是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move
同时使用左值和右值:
但是既然整个点std::move
是转换为右值,为什么我们甚至允许右值std::move
呢?std::move
如果只接受左值不是更有意义吗?
那么无意义的表达式std::move(b + c)
会导致编译时错误。
对于初学者来说,上面的实现std::move
也更容易理解,因为代码完全按照它的样子做:它接受一个左值并返回一个右值。您不必了解通用引用、引用折叠和元函数。
那么为什么std::move
设计为同时采用左值和右值呢?
c++ - 身份别名模板可以作为转发参考吗?
考虑下面的代码片段:
i
是一个左值,因此如果foo
声明一个转发引用参数,它应该编译。但是,如果identity<T>&&
变成 be int&&
,它应该会引发错误。
该代码在 GCC 6.0.0 ( demo )中编译。
该代码无法在 Clang 3.7.0 ( demo ) 中编译并显示错误消息:
哪一个是对的?
c++ - 转发引用可以用别名模板来别名吗?
c++ - 我应该什么时候 std::forward 函数调用?
我在Effective Modern C++中看到的一个代码片段巧妙地实现了创建函数 timer的检测原理:
我的问题是关于std::forward<decltype(func)>(func)(...
- 据我了解,我们实际上是将函数转换为其原始类型,但为什么需要这样做呢?看起来一个简单的调用就可以解决问题。
- 还有其他情况我们使用完美转发来进行函数调用吗?
如果我们想让计时器类型成为编译时间常数,这看起来像是在 lambda 表达式中使用熟悉的模板语法的一个很好的用例。