Đó là cách các thao tác dòng làm việc. Thao tác là các hàm được chuyển đến toán tử < < làm đối số. Sau đó, bên trong toán tử, chúng được gọi đơn giản.
Vì vậy, bạn có chức năng tuyên bố như
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
và bạn vượt qua con trỏ của nó để điều hành < <. Và bên trong các nhà điều hành mà tuyên bố cái gì đó như
ostream& ostream::operator << (ostream& (*op)(ostream&));
chức năng là called.like
return (*endl)(*this);
Do đó khi bạn nhìn thấy kỷ lục
std::cout << std::endl;
sau đó std::endl
là con trỏ hàm được truyền cho operator <<
làm đối số.
Trong kỷ lục
std::endl(std::cout);
namespace prefix trước tên endl
có thể được bỏ qua bởi vì trong trường hợp này, trình biên dịch sẽ sử dụng Đối số Lookup phụ thuộc. Do đó, hồ sơ này
endl(std::cout);
sẽ biên dịch thành công.
Tuy nhiên nếu gửi kèm tên hàm trong ngoặc sau đó ADL không được sử dụng và các hồ sơ sau
(endl)(std::cout);
sẽ không được biên dịch.
Nguồn
2015-03-27 07:22:15
Tương tự như [Hành vi thú vị của trình biên dịch với không gian tên] (http://stackoverflow.com/q/25976267/1708801) –