可变模板和右值引用 考虑下面的C++代码< /P> template <class... Args> void f (const int x, const int y, Args&&... args) { // Do something }
这给了我一个错误,它不能将x从float类型转换为float类型&&&可变模板和右值引用 考虑下面的C++代码< /P> template <class... Args> void f (const int x, const int y, Args&&... args) { // Do something },c++,c++11,variadic-templates,lvalue,rvalue,C++,C++11,Variadic Templates,Lvalue,Rvalue,这给了我一个错误,它不能将x从float类型转换为float类型&&& 如何使用同时接受左值和右值引用的可变模板定义函数。如果指定参数,则必须提供左值引用: f<int, float&, double>(10, 20, 30, x, 50.0); 如果指定参数,则必须提供左值引用: f<int, float&, double>(10, 20, 30, x, 50.0); 据我所知,这里的参数可以是左值引用,也可以是右值引用,这取决于编译时的类型推断 你
如何使用同时接受左值和右值引用的可变模板定义函数。如果指定参数,则必须提供左值引用:
f<int, float&, double>(10, 20, 30, x, 50.0);
如果指定参数,则必须提供左值引用:
f<int, float&, double>(10, 20, 30, x, 50.0);
据我所知,这里的参数可以是左值引用,也可以是右值引用,这取决于编译时的类型推断
你说对了一半。Args&&将是左值或右值引用。但是Args本身要么是左值引用,要么不是引用。更简单的情况是:
template <typename T> void foo(T&& ) { }
foo(1); // T is int
int x;
foo(x); // T is int&
或者通过float&指定它是左值:
据我所知,这里的参数可以是左值引用,也可以是右值引用,这取决于编译时的类型推断
你说对了一半。Args&&将是左值或右值引用。但是Args本身要么是左值引用,要么不是引用。更简单的情况是:
template <typename T> void foo(T&& ) { }
foo(1); // T is int
int x;
foo(x); // T is int&
或者通过float&指定它是左值:
简单的推论给出了一个错误,即。。。。。file.h:41:87:注意:无法将“x”类型“float”转换为类型“float&&”。我用模板修复了打字错误…@subzero与你问题中的函数不完全一致,它不会。简单的推断给出了一个错误,说。。。。。file.h:41:87:注意:无法将“x”类型“float”转换为类型“float&&”。我用模板修复了打字错误…@subzero与您问题中的函数不完全一致,它不会。
f<int, float, double>(10, 20, 30, std::move(x), 50.0);
f<int, float&, double>(10, 20, 30, x, 50.0);
f(10, 20, 30, x, 50.0);