2012-06-11 29 views
9

Tôi tò mò nếu std :: cout có giá trị trả về, bởi vì khi tôi làm điều này:Có std :: cout có giá trị trả lại không?

cout << cout << ""; 

một số mã hexa được in ra. Ý nghĩa của giá trị in này là gì?

+1

Mặc dù bản thân câu hỏi không phải là (hoàn toàn) một bản sao chính xác, hầu hết các câu trả lời cho [câu hỏi trước] (http://stackoverflow.com/q/7489069/179910) cũng áp dụng ở đây. –

Trả lời

18

Bởi vì toán hạng của cout << cout là kiểu do người dùng định nghĩa, khái niệm là một cách hiệu quả một cuộc gọi chức năng. Trình biên dịch phải tìm ra số operator<< phù hợp nhất với các toán hạng, trong trường hợp này là cả hai loại std::ostream.

Có nhiều quá tải toán tử ứng cử viên để chọn, nhưng tôi sẽ chỉ mô tả quá trình kết thúc được chọn, theo quy trình giải quyết quá tải thông thường.

std::ostream có toán tử chuyển đổi cho phép chuyển đổi thành void*. Điều này được sử dụng để cho phép kiểm tra trạng thái của luồng dưới dạng điều kiện boolean (nghĩa là nó cho phép if (cout) hoạt động).

Quyền tay operand biểu cout được ngầm chuyển đổi sang void const* sử dụng toán tử chuyển đổi này, thì tình trạng quá tải operator<< mà phải mất một ostream&void const* được gọi là để viết giá trị con trỏ này.

Lưu ý rằng giá trị thực tế do chuyển đổi ostream sang void* không được chỉ định. Đặc tả chỉ yêu cầu rằng nếu luồng ở trạng thái xấu, một con trỏ null được trả về, nếu không thì một con trỏ không null được trả về.


Quá tải cho chèn luồng có giá trị trả về: chúng trả về luồng được cung cấp làm toán hạng. Đây là những gì cho phép chuỗi các hoạt động chèn (và cho các luồng đầu vào, các hoạt động khai thác sử dụng >>).

14

coutkhông có giá trị trả lại. cout là một đối tượng thuộc loại ostream. operator << có giá trị trả về, nó trả về một tham chiếu đến cout.

Xem http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ để tham khảo.

Chữ ký duy nhất mà phù hợp là:

ostream & hành < < (ostream & (* pf) (ostream &));

để nó trả về con trỏ tới thành viên operator<<.

câu trả lời của James. :)

+1

Tôi không thể thấy bất kỳ cách nào mà mã này ngữ nghĩa đánh giá để "in địa chỉ của một toán tử' '' '." Có nhiều khả năng nó được đánh giá là '(cout << cout) <<" "' và cuộc gọi bên trong hiển thị bất kỳ 'void *' nào mà 'cout' được chuyển thành. – cdhowie

1

Tôi tin rằng sẽ là địa chỉ của đối tượng ostream rằng "" đã được in để

+0

@Luchian đánh tôi với một tham chiếu –

+1

Không, bởi vì nó trả về một tham chiếu không phải là một con trỏ. –