右引用左值

Right reference on lvalue

本文关键字:引用      更新时间:2023-10-16

什么时候右值成为左值的右引用?

示例如下,用std::forward求解:

void g(int && v1, int & v2)
{
    std::cout << v1 << " " << ++v2 << std::endl;
}
template <typename F, typename T1, typename T2>
void flip(F f,T1 && t1, T2  && t2){
    g(t2, t1);
}

调用时出现如下错误:

flip(g, j, 2);

我的问题是:在flip(g, j 2)中,第三个参数2为右值。
在函数flip中,参数t2是对2的正确引用。当调用g时,似乎t2是对lvalue的正确引用。
在什么情况下,通过引用(没有复制?)接收的rvalue成为左值?

示例如下:https://ideone.com/cJvFCg

有一个"if it has a name"规则说,在这样的代码中,如果变量有一个名称(在这种情况下,你的t2),那么在这一点上,它成为一个左值。(参见Scott Meyers Effective Modern c++)

为了保留调用者的原始意图,您确实应该使用完美转发:

g(std::forward<T2>(t2), ...)