2015-06-10 104 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