变量模板和R值参考

Variadic Templates and RValue refs

本文关键字:值参 参考 变量      更新时间:2023-10-16

考虑以下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);