回答
由於cout << cout
操作數是用戶定義類型的地址,表達實際上是一個函數調用。編譯器必須找到與操作數匹配的最佳operator<<
,在這種情況下,它們都是std::ostream
類型。
有許多候選運算符重載可以從中進行選擇,但我只是描述最後選擇的運算符重載,遵循通常的重載解析過程。
std::ostream
有一個轉換運算符,允許轉換爲void*
。這用於使流測試狀態成爲布爾條件(即允許if (cout)
工作)。
的右邊的操作數表達cout
使用該轉換運算符,則該過載operator<<
接受一個ostream&
和void const*
被稱爲寫這個指針值隱式轉換爲void const*
。
請注意,從ostream
到void*
轉換產生的實際值未指定。該規範僅規定如果流處於不良狀態,則返回空指針,否則返回非空指針。
的operator<<
重載流插入確實有返回值:他們返回被作爲操作數提供的數據流。這是允許插入操作的鏈接(並且對於輸入流,使用>>
的提取操作)。
cout
沒有返回值。 cout
是ostream
類型的對象。 operator <<
具有返回值,它返回對cout
的引用。
參見http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/作爲參考。
匹配唯一的簽名是:
ostream的&操作者< <(ostream的&(* PF)(ostream的&));
因此它返回指向operator<<
成員的指針。
詹姆斯的答案。 :)
我看不到任何方式,這段代碼在語義上評估爲「打印一個'operator <<'函數的地址。」它更有可能被評估爲'(cout << cout)<<「」',內部調用顯示'cout'轉換成的任何'void *'。 – cdhowie
相信會是ostream的對象,即「」得到打印到
@Luchian打我參考 –
不,因爲它返回一個引用而不是指針。 –
- 1. 評價cout是否有constexpr值?
- 2. std :: strftime返回值
- 3. cout不打印函數的返回值?
- 4. std :: cout和std :: wcout有什麼區別?
- 5. 爲什麼cout返回smanip?
- 6. CString to std :: cout
- 7. std :: chrono和cout
- 8. std :: atomic :: operator ++是否真的按值返回?
- 9. std :: find無論值是否在向量中都返回vec.end()
- 10. 是否有可能從set_trace_func返回值?
- 11. malloc()是否有最大的返回值?
- 12. std :: cout << x;和std :: cout << x << std :: endl;?
- 13. 澄清使用std ::,std :: cout
- 14. pop_back()返回值在std :: list?
- 15. C++ 11:是否有可能從函數返回一個std :: initializer_list?
- 16. std :: multimap :: equal_range是否有可能返回不正確的結果?
- 17. 是否有隻返回其參數的std函數?
- 18. 使用函數返回值初始化std :: string,是否有副本?
- 19. 重定向std :: cout
- 20. 在所有的cout被寫入CONSOL之前,main()是否可以返回?
- 21. 爲什麼std :: cout而不是簡單的cout?
- 22. C++ - 最佳實踐:使用'的std :: cout` VS'的std :: cout`
- 23. 如何在C++中檢查輸出流是否爲std :: cout?
- 24. std :: cout是否完全在堆棧上運行?
- 25. 是否有可能將std :: bind的返回值轉換爲std :: function而不進行構造?
- 26. C++ - 如何知道map :: upper_bound()是否沒有返回值?
- 27. 新來的Xcode,不能使用cout,只有std :: cout的作品
- 28. 是否有任何errno是read()的有效POSIX返回值?
- 29. std :: getline()返回
- 30. 檢查是否返回的值是空
儘管問題本身並不完全相同,但[上一個問題]的大部分答案(http://stackoverflow.com/q/7489069/179910)也適用於此。 –