は、次のコードスニペットを考えてみ割り当て可能ではありません。ブースト::ラムダ関数から構築function_output_iteratorが
auto f = [](int x) { std::cout << x; };
auto it = boost::make_function_output_iterator(f);
decltype(it) it2 = it; // Ok, copied
it2 = it; // Does not compile, cannot assign!
問題は、このように構成さfunction_output_iterator
が割り当て可能ではないので、Iterator概念を満たしていない、これはタイプがCopyAssignableであることが必要です。
UnaryFunctionはアサイナブルかつコピー構築可能でなければなりません:
これは明らかにsaysboost Function Output Iterator documentationいるので、バグではありません。
lambda functionの代入演算子が削除されている間:
ClosureType& operator=(const ClosureType&) = delete;
だから、この動作は、技術的に正しいですが、私にとってはやや予想外です。私はラムダ関数によって作られたクロージャを与えてfunction_output_iterator
を構築することが完全に合理的な欲求であると思う。なぜこのユースケースが問題を引き起こすのかは私には不便なようです。
こんにちは、このStackOverflow、私はいくつかの質問をする必要があります:)ここでは:どのようにこれを回避するには? function_output_iterator
のように動作するクロージャを指定した正しいイテレータを取得するにはどうすればよいですか?
もう1つ:提案やバグレポートを作成する価値はありますか?
'auto'の代わりに' std :: function'を使用すると動作します:http://coliru.stacked-crooked.com/a/0e92b2ce686b4dff – jrok
何かをキャプチャする必要がない場合、もう一つの方法:http: //coliru.stacked-crooked.com/a/41d7a423016c38e7 – llonesmiz
@jrok良いコメントは、答える必要があります。 – Mikhail