std::bind
の私の使用は、今ラムダが幅広い支持を得ていることを0まで低下しました。
std::bind
はラムダ関数に特有の問題はありますか?
ラムダが追加された時点で、標準でstd::bind
を維持する魅力的な理由はありましたか?
std::bind
の私の使用は、今ラムダが幅広い支持を得ていることを0まで低下しました。
std::bind
はラムダ関数に特有の問題はありますか?
ラムダが追加された時点で、標準でstd::bind
を維持する魅力的な理由はありましたか?
あなたが値または参照でキャプチャすることができ、問題が値によってキャプチャが本当による」捕獲を意味していることですコピーする。これは、移動のみのタイプのショーストッパーです。だから、次の操作を実行するためにラムダを使用することはできません。
struct foo { void bar() {} };
std::unique_ptr<foo> f { new foo };
auto bound = std::bind(&foo::bar, std::move(f));
static_assert(std::is_move_constructible<decltype(bound)>::value, "");
bound();
IIRC標準委員会は簡潔ラムダキャプチャリスト内の任意の式は、([std::move(f)] { return f.bar(); }
のように見える可能性がある)この問題を解決することが可能と考えられますが、私はしないでください堅実な提案があったと考えて、C++ 11は既に遅れて走っていました。
ラムダとの単相性行動の制限とそれに対する制限は、私のためのディフェンスブレーカーです。
いい例! 'bind'オブジェクトは動的' foo'オブジェクトを所有しますか?それ自体はコピー不可能になりますか? –
@KerrekSB絶対に、両方のアカウントで。 –
@Luc素晴らしい例、私はこれを正確に探していました。残りの問題は、バインド式をstd :: function
bind
は、バインドされたメンバ関数への参照を作成するための素晴らしいです:
Foo x;
auto f = std::bind(&Foo::bar, &x, 12, true);
register_callback(f);
編集:リュックダントンが示すように、この構造は非常に柔軟で、インスタンスのポインタが装いの驚くべき多様に来るようにすることができます(スマートポインタなど)[/]
実現可能であれば、ラムダはおそらく最適化の可能性が高いため、バインド式がまだ存在するため、おそらくラムダが望ましいでしょう。
(いずれにしても、auto
は呼び出し可能オブジェクトを格納するタイプのためstd::function
上で望ましい。)
バインドは素晴らしいですが、ラムダが優れています。この 'auto f = [&x](){return x.bar(12、true); }; 'かなり簡潔です。だから、 'std :: bind'がいつ優先されるのでしょうか? –
@deft_code:Hmm ... 'bind'は最後にプレースホルダを埋めます(私の' f'は引き続き多くの引数を取ることができます)ので、バインド式がどこかのテンプレートの一部であるときにはもっときれいです。しかし、それは良い質問です! –
引数の型が長い場合、バインドはlambdasよりも__far__である可能性があります。 – ildjarn
http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –
彼らはまだかなり直交IMOです。 –