Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可变模板和右值引用 考虑下面的C++代码< /P> template <class... Args> void f (const int x, const int y, Args&&... args) { // Do something }_C++_C++11_Variadic Templates_Lvalue_Rvalue - Fatal编程技术网

可变模板和右值引用 考虑下面的C++代码< /P> template <class... Args> void f (const int x, const int y, Args&&... args) { // Do something }

可变模板和右值引用 考虑下面的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); 据我所知,这里的参数可以是左值引用,也可以是右值引用,这取决于编译时的类型推断 你

这给了我一个错误,它不能将x从float类型转换为float类型&&&


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

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

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);