c++ - 非右值引用的可变参数的 C++ 转发
问题描述
考虑:
template <typename... Args>
void foo(Args... args) {
bar(std::forward<Args>(args)...);
}
template <typename... Args>
void foo2(Args&&... args) {
bar(std::forward<Args>(args)...);
}
我理解在 的情况下完美的右值引用转发foo2
,但是转发 的可变参数值的目的是foo
什么?
如果foo
看起来像这样,会有什么不同?
template <typename... Args>
void foo(Args... args) {
bar(args...);
}
解决方案
这不是一回事。
在这个
template <typename... Args>
void foo(Args... args) {
bar(std::forward<Args>(args)...);
}
Args
永远不会被推论为引用(foo(Args...)
表示foo
按值而不是按引用获取参数);- 另一方面
std::forward<T>(t)
,无非static_cast<T&&>(t)
是程序员有更明确的意图;
这两件事加起来就是static_cast<Args&&>(args)...
有一个右值引用返回类型,即返回一个右值(因为Args
不是一个引用,所以在和之间不会发生引用折叠Args
,&&
给出一个左值引用返回类型,这意味着一个左值返回值)。
所以不,在您的第一个版本中没有完美的转发foo
。其中std::forward
in 它无条件地将其参数转换为右值;这通常是std::move
的工作:
// this is equivalent to the code above
template <typename... Args>
void foo(Args... args) {
bar(std::move(args)...);
}
推荐阅读
- reactjs - 有没有办法在 React 中显示图像之前加载它们?
- php - 如何保护 HTML 表单免受 XSS 攻击?
- memory - 对英特尔傲腾的内存驱动技术 (IMDT) 和 DCPMM 内存模式之间的区别感到困惑
- python - 如何在 TensorFlow v2 中传递会话对象?
- react-native - react-native-document-picker uri 获取 rael 路径获取
- javascript - 如果用户使用检查元素删除字段,如何防止表单提交
- swift - Swift - NSImage,内存泄漏?
- python - Pandas - 使用 range(x) 在“for”循环中填充数据框
- vuejs2 - 我必须以哪种格式使用 Server Table 将数据返回到 vue-tables-2
- c++ - c++ 编译器无法识别已声明的字符串函数 C2039