2011-04-08 186 views
38

我看StackOverflow上的代碼每隔一段時間,詢問一些超載含糊不清的東西涉及到像一個函數參考的:參考在C++

void foo(int&& param); 

我的問題是:爲什麼這個連上來?或者說,你什麼時候會「參考參考」?與普通的舊參考有什麼不同?我從來沒有在現實世界的代碼中遇到過這個問題,所以我很好奇哪種代碼需要這樣的代碼。

回答

39

這是一個右值參考,Bjarne將其描述爲here

無恥複製( 「引用」):

的右值參考

右邊的值可以參考爲化合物類型 非常類似於C++的傳統 參考。爲了更好地區分這兩種類型,我們將傳統的 C++引用作爲左值引用。 當使用術語引用時,它 引用了這兩種引用: 左值引用和右值引用。

左值引用由 組成,在某種類型後放置&。

A a; A& a_ref1 = a; // an lvalue reference 

右邊的值可以參照由 放置& &某種類型之後形成。

A a; A&& a_ref2 = a; // an rvalue reference 

右邊的值可以參照行爲就像 不同之處在於它可以 綁定到一個臨時(一個rvalue) 而不能結合(非常數)左值參考 左值參考右值。

A& a_ref3 = A(); // Error! 
A&& a_ref4 = A(); // Ok 
+9

任何人想知道爲什麼有人會想要 - 更不用說需要使用它? – wallyk 2011-04-08 06:02:36

+1

搜索「完美轉發」 – 2011-04-08 06:06:18

+0

@wallyk:改進了資源管理。 – GManNickG 2011-04-08 06:08:46

14

它不是參考:這樣的事情不存在。

這是一個rvalue reference,這是在即將標準化的C++ 11中添加的新功能。

+7

你能解釋一下嗎? – hhafez 2011-04-08 05:54:38

7

這是一個右值引用。請注意,用於布爾運算AND和右值引用的&&令牌以及用於逐位AND和正常引用的令牌,就語言而言,它們是不同的「字」。

右值引用(通常)綁定到一個對象,該對象在右值引用完成後可能會保留在不確定狀態,這大概是因爲該對象將被銷燬。

簡而言之,將變量綁定到右值引用通常是您對它做的最後一件事。

與常規引用不同,但與const &引用不同,右值引用可以綁定到右值(不能直接獲取地址的表達式)。像常規引用一樣,但不像const &引用,可以使用右值引用來修改其對象。

+0

「不確定性」有點過分陳述......它需要處於安全狀態才能銷燬,但無需保留其早期值。 – 2011-04-08 06:25:28

+0

@Tony:是的,不確定但有效。接受右值引用並對其進行修改的函數通常不會指定如何修改引用。 – Potatoswatter 2011-04-08 06:29:04

+0

@Patatoswatter:對不起 - 我仍然對你的陳述感到困惑。 「通常不會指定如何修改引用」......假設「如何修改引用」是指「引用的對象如何修改」(我無法想象其他任何內容) - 函數通常會精確地確定,例如:一個移動構造函數可能會在容器上使用'swap'並且竊取指針,並將它們設置爲NULL在引用的對象中.... – 2011-04-08 06:49:15