我有这段代码:
void f2(int& lvalue)
{
std::cout <<"lvalue\n";
}
void f2(int&& rvalue)
{
std::cout << "rvalue\n";
}
template<typename T>
void f(T&& param)
{
f2(param);
}
我希望得到&#34;左右&#34;如果我用 f 打电话:
int v = 10;
f(v);
并期待&#34; rvalue&#34;如果我用 f 打电话:
f(10);
但是,我总是得到左值的情况。请问,任何人都可以解释我错在哪里。
答案 0 :(得分:9)
您需要转发参数。虽然param
的类型可能是左值引用,但param
本身仍然是左值。
f2(std::forward<T>(param));
std::forward
确保param
获得与传递的参数相同的引用限定符。这称为 perfect-forwarding 。
如果您致电f(10)
:
param
是左值std::move(param)
是右值std::forward<T>(param)
如果您致电f(v)
:
param
是左值std::move(param)
是右值std::forward<T>(param)