2012-06-11 47 views
9

我很好奇,如果性病::法院有返回值,因爲當我這樣做:std :: cout是否有返回值?

cout << cout << ""; 

一些六碼打印。這個印刷的價值是什麼意思?

+1

儘管問題本身並不完全相同,但[上一個問題]的大部分答案(http://stackoverflow.com/q/7489069/179910)也適用於此。 –

回答

18

由於cout << cout操作數是用戶定義類型的地址,表達實際上是一個函數調用。編譯器必須找到與操作數匹配的最佳operator<<,在這種情況下,它們都是std::ostream類型。

有許多候選運算符重載可以從中進行選擇,但我只是描述最後選擇的運算符重載,遵循通常的重載解析過程。

std::ostream有一個轉換運算符,允許轉換爲void*。這用於使流測試狀態成爲布爾條件(即允許if (cout)工作)。

的右邊的操作數表達cout使用該轉換運算符,則該過載operator<<接受一個ostream&void const*被稱爲寫這個指針值隱式轉換爲void const*

請注意,從ostreamvoid*轉換產生的實際值未指定。該規範僅規定如果流處於不良狀態,則返回空指針,否則返回非空指針。


operator<<重載流插入確實有返回值:他們返回被作爲操作數提供的數據流。這是允許插入操作的鏈接(並且對於輸入流,使用>>的提取操作)。

14

cout沒有返回值coutostream類型的對象。 operator <<具有返回值,它返回對cout的引用。

參見http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/作爲參考。

匹配唯一的簽名是:

ostream的&操作者< <(ostream的&(* PF)(ostream的&));

因此它返回指向operator<<成員的指針。

詹姆斯的答案。 :)

+1

我看不到任何方式,這段代碼在語義上評估爲「打印一個'operator <<'函數的地址。」它更有可能被評估爲'(cout << cout)<<「」',內部調用顯示'cout'轉換成的任何'void *'。 – cdhowie

1

相信會是ostream的對象,即「」得到打印到

+0

@Luchian打我參考 –

+1

不,因爲它返回一個引用而不是指針。 –

相關問題