ラムダの使用を実験しており、以下のテストでは 'hi'とコンパイルします。ラムダをstd :: coutのパラメータとして使用する
auto lmda = [](std::ostream& os) -> std::ostream& { os << "hi"; return os; };
std::cout << lmda;
ただし、キャプチャを追加するとコンパイルされません。 例:
std::vector<int> v(5, 3);
auto lmda = [&v](std::ostream& os) -> std::ostream& { os << v.size(); return os; };
std::cout << lmda;
ビルドエラーは次のとおりです。
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)
それは第二の例では失敗した理由を、私は得ることはありません。 いずれのリードですか?
注:この過負荷は、 'std :: endl'や' std :: boolalpha'のようなマニピュレータが機能するように存在します。オーバーロードされた '<<'演算子を使って 'struct'を実行しただけで、後で知ることができます。 – Simple
@簡単なポイント、それは私が含まれているが、答えを追加したcppreferenceリンクに記載されていた。 –