rvalue何时成为左值的正确参考?
示例如下,应使用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
是rvalue
在函数flip
中,参数t2
在2上是正确的引用。当g
被调用时,似乎t2
是对左值的正确引用。
通过引用收到的rvalue(没有复制?)在什么时候变成了左值?
答案 0 :(得分:5)
有"if it has a name"规则说在这样的代码中,如果变量有一个名字(在这种情况下,你的t2
),那么它就变成了左值。 (另见Scott Meyers Effective Modern C++。)
为了保留调用者的原始意图,您确实会使用perfect forwarding:
g(std::forward<T2>(t2), ...)