右值什么时候成为左值的正确引用?
示例如下,应该用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
是对左值的正确引用。
通过引用接收的右值(没有复制?)在什么时候变成了左值?
最佳答案
这是"if it has a name"规则说,在这样的代码中,如果变量有一个名称(在本例中为您的 t2),那么此时它就成为左值。 (另请参阅斯科特·迈耶斯 Effective Modern C++。)
为了保留调用者的原始意图,您确实可以使用 perfect forwarding :
g(std::forward<T2>(t2), ...)
关于c++ - 左值的正确引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760638/