Tôi đang thử nghiệm với lambda sử dụng và khi kiểm tra sau đây nó biên dịch nói 'hi'.Sử dụng lambda làm tham số cho std :: cout
auto lmda = [](std::ostream& os) -> std::ostream& { os << "hi"; return os; };
std::cout << lmda;
Nhưng khi thêm chụp, nó không biên dịch. Ví dụ:
std::vector<int> v(5, 3);
auto lmda = [&v](std::ostream& os) -> std::ostream& { os << v.size(); return os; };
std::cout << lmda;
Build lỗi là:
In function 'int main()':
10:18: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
In file included from /usr/include/c++/4.9/iostream:39:0,
from 2:
/usr/include/c++/4.9/ostream:602:5: note: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = main()::<lambda(std::ostream&)>]'
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
Tôi không hiểu tại sao nó bị lỗi trong ví dụ thứ hai. Bất kỳ khách hàng tiềm năng nào?
Lưu ý: quá tải này tồn tại để các trình xử lý như 'std :: endl' và' std :: boolalpha' hoạt động. Họ có thể chỉ là 'struct' với các toán tử '<<' bị quá tải, nhưng có thể bị hindsight. – Simple
@Điểm đơn giản, được ghi chú trong liên kết cppreference mà tôi đưa vào nhưng thêm nó vào câu trả lời. –