Ank*_*lla 3 c++ templates rvalue lvalue
我的问题很简单
#include <iostream>
using namespace std;
template <typename T>
void f(T&& i) {
cout << i << endl;
}
void g(int&& i) {
cout << i << endl;
}
int main() {
int i = 0;
f(i); // works fine
g(i); // candidate function not viable: no known conversion from 'int' to 'int &&'
// for 1st argument void g(int&& i)
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以将左值传递给模板化函数f()而不是非模板化函数g()
您的f()函数不希望有右值,而是要有转发参考。
尽管f()和g()看起来非常相似(由于&&符号),但它们却截然不同。
(例如,参见通用引用和转发引用之间是否有区别?)
如果您确实想传递i给g(),则有两种选择:
i(然后视为右值)g(int{i})std::move();则此后i不得再使用原件。g(std::move(i))