2013-04-06 38 views
0

有沒有辦法刪除所有我的函數的「垂直」的版本,而不需要改變「重災區」行到「固定」?選擇函數聲明與左值右值或參數

是我的程序工作正常,但我想如果有一種方式來獲得從這個版本我所有的功能的車程。

記住int是不是真的在我的節目int,但一個類型別名可以是對象(例如container_reference<std::array<double,4>>)或引用(例如std::array<double,4> &

void func(int &&m) { cout << "rvalue: " << m << endl; } 
void func(int &m) { cout << "lvalue: "; func(std::move(m)); } // PLUMB! 

int main() 
{ 
    int a = 5; 
    func(a); // HIT! 
    func(std::move(a)); // FIXED! 
    func(6); 
    func(a + 5); 
} 
+0

我覺得你真的不明白,你在做什麼。所以問題是你想要做什麼?你想讓你的'func'和rvalues或者左值一起工作嗎? – Mikhail 2013-04-06 19:04:09

+0

我想與兩者一起工作。但身體代碼是完全一樣的。 – Chameleon 2013-04-06 19:05:25

回答

5

我有一個有點麻煩正是明白你想要什麼,但是這可能是一個選項:

template<typename T> 
void func(T &&m) { 
    // ... 
} 

T&&被戲稱爲「通用參考」,因爲它會結合這兩個左值,並且由於和借鑑右值e崩潰的規則。

+0

通用參考僅適用於模板參數,對嗎? so'template void func Chameleon 2013-04-06 19:09:20

+0

@Chameleon是的,它需要推導類型。我不小心有'auto &&',但我的意思是'T &&'在這裏。儘管'auto &&'可以在其他地方使用,也可以推斷出它。 – Pubby 2013-04-06 19:13:05