Variadic模板和RValue参考

时间:2015-06-24 18:26:22

标签: c++ c++11 variadic-templates lvalue rvalue

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

这给了我一个错误,说它无法将float类型的x转换为float&&类型。

如何使用接受左值和右值引用的可变参数模板定义函数。

2 个答案:

答案 0 :(得分:3)

如果指定参数,则必须提供左值引用:

f<int, float&, double>(10, 20, 30, x, 50.0);

或者只是让编译器为你演绎

f(10, 20, 30, x, 50.0);

答案 1 :(得分:2)

  

据我了解,Args这里可以是左值或右值引用,具体取决于编译时的类型推导。

你是对的。 Args&&可以是左值或值引用。但Args本身要么是左值引用,要么不是引用。一个更简单的案例:

template <typename T> void foo(T&& ) { }

foo(1); // T is int
int x;
foo(x); // T is int&

float指定x时,您指定该特定参数的类型为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);