变量模板和R值参考
Variadic Templates and RValue refs
考虑以下C++代码
template <class... Args>
void f (const int x, const int y, Args&&... args) {
// Do something
}
据我所知,这里的Args
可以是左值引用,也可以是右值引用,这取决于编译时的类型推导。
因此,我应该能够使用-调用函数
float x = 40.0;
f<int, float, double>(10, 20, 30, x, 50.0);
这给了我一个错误,说它无法将x从类型float
强制转换为类型float&&
。
如何使用同时接受左值和右值引用的可变模板定义函数。
据我所知,这里的
Args
可以是左值引用,也可以是右值引用,这取决于编译时的类型推导。
你说得对一半。Args&&
将是左值或右值引用。但Args
本身要么是左值引用,要么不是引用。一个更简单的例子:
template <typename T> void foo(T&& ) { }
foo(1); // T is int
int x;
foo(x); // T is int&
为x
指定float
时,指定的是该特定参数的类型为float&&
,并且不能将左值float
隐式转换为右值。你必须(通过std::move
)投射它:
f<int, float, double>(10, 20, 30, std::move(x), 50.0);
或者通过float&
:指定它是一个左值
f<int, float&, double>(10, 20, 30, x, 50.0);
或者简单地让演绎发挥作用:
f(10, 20, 30, x, 50.0);
如果指定参数,则必须给出左值引用:
f<int, float&, double>(10, 20, 30, x, 50.0);
或者简单地让编译器为您推导
f(10, 20, 30, x, 50.0);
相关文章:
- 通用参考 l 值不复制对象
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- Lambda闭包左值可以作为右值参考参数传递
- 如何获取地图值的参考?
- 演绎指南中的参考文献和值之间的差异
- 赋值运算符的返回值可以作为参考吗?
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 超载函数既不按值,也不是通过参考来对象,而是将撤销的指针换成对象
- 移动 l 值参考参数是否是一种不好的做法?
- C 按值返回与参考返回
- 为什么未调用具有常量参考返回值的超载方法
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 作为RVALUE参考与双移动值的传递
- 可以std ::移动引起切片时切入L值参考
- 为什么通用参考和右值参考的流量不同
- 提供功能版本,其中可用值和参考
- 通过值和参考,对象构建返回对象之间的区别
- 按值传递参考参数
- C 模板函数基于参数是值还是参考
- 使用具有默认值的参考参数是一种良好的做法