2015-06-10 42 views
2

右值参数左值是什么时候?左值右参考

例子如下,它应该与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是对左值的正确引用。
在参考文献中收到的参考文献(未复制?)是什么时候变成了左值?

这里是例子:https://ideone.com/cJvFCg

+0

,但“最匹配的类型,包括价值参考' – Hcorg

+0

我知道。但是:在flip(g,j,2)中''第三个参数是''int &&''类型的右值。相比之下,t2是从''int &&&& t2''推导到''int && t2'',这是正确的参考。显然,它不是右值,虽然它是由一个初始化的。 – tbukic

+0

谷歌为“C++通用参考” –

回答

5

还有的"if it has a name"规则说中这样的代码,如果变量有一个名字(在这种情况下,您t2),那么在这一点上它成为一个左值。 (参见斯科特迈尔斯Effective Modern C++。)

为了保持调用者的原意,你的确会使用perfect forwarding:在模板&&并不一定意味着“右值引用”

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

Thanx!我知道解决方案,但并没有完全理解问题的根源。 “如果它有一个名字”是关键,现在对我来说这完全清楚。 :) – tbukic