2016-02-14 16 views
6

は、次のコードスニペットを考えてみ割り当て可能ではありません。ブースト::ラムダ関数から構築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つ:提案やバグレポートを作成する価値はありますか?

+2

'auto'の代わりに' std :: function'を使用すると動作します:http://coliru.stacked-crooked.com/a/0e92b2ce686b4dff – jrok

+3

何かをキャプチャする必要がない場合、もう一つの方法:http: //coliru.stacked-crooked.com/a/41d7a423016c38e7 – llonesmiz

+0

@jrok良いコメントは、答える必要があります。 – Mikhail

答えて

5

単にstd::functionに閉鎖を保存します。

std::function<void(int)> f = [](int x) { std::cout << x; }; 
auto it = boost::make_function_output_iterator(f); 

Test snippet.

7

別のオプションを、あなたは閉鎖は、イテレータとそのコピーをより長生きstd::refでそれをラップすることを確認している場合:

auto f = [](int x) { std::cout << x; }; 
auto it = boost::make_function_output_iterator(std::ref(f)); 

Demo

そして、ここでは、この特定の問題を修正ブーストユーティリティクラスのための提案です:boost::regular

boost mailing listで対応する説明を参照してください。

関連する問題