2017-01-13 15 views
21

C++ 17このオブジェクトのコピーキャプチャをa capture specification of [*this]コピーします。C++ 17ラムダキャプチャ* this

これはどのように便利ですか? thisのキャプチャとはどのように違いますか? [tmp = *this]でC++ 14でこれを実現できませんか?


P0018R3はその一例で[=, tmp = *this]の代わり[tmp = *this]を使用する理由を説明するためのボーナス。彼らが[tmp = *this]を使用していた場合、C++ 14ソリューションの記載されているすべての欠点は排除されます。

+3

私は彼らがあまりにも多くの例を単純化したと思います。ローカル変数やパラメータを追加したら、コピーでそれらをキャプチャしたいと思うでしょう。 '[=、..]'部分は意味があります(明示的に1つ1つ、つまりそれを明示的に取り込みたくない場合)。 – dyp

答えて

18

どのように便利ですか? *thisのコピーが必要な場合に便利です。たとえば、ラムダが評価されるまでに*this自体が有効でなくなった場合などに便利です。

キャプチャとどう違うのですかthis?オブジェクトのコピーを作成します。その結果、ラムダが評価されるとき、そのthisポインタは、元のオブジェクトではなくコピーを参照します。

[tmp = *this]でC++ 14で達成できますか?しかし、[*this]は、tmp.でメンバーへの接頭辞を付けずにコードを移動できるので、より便利です。それ以外の場合、特に[=, tmp = *this]を使用すると、元のオブジェクトのメンバーを参照するときに誤って参照することができます(特に、カット+ペーストプログラミングの習慣がある場合)。元のthisにアクセスできないので、[=,*this]はこの場合より安全な代替手段です。

1

*thisがハンドルクラスであり、shared_ptrを共有状態に維持するとします。

共有implは、(たとえば)プロトコルハンドラの状態マシンです。

ハンドルクラスは、一連の非同期ハンドラを通過するので、それ自体はコピー可能でなければなりません。各ハンドラは共有状態を変更します。

これは、カスタムasioサービスで使用するプロトコルハンドラ(たとえば、http_protocol_socket)を使用する場合があります。

[=, tmp = *this]は無差別thisポインタ自体、かなり危険、などの値によってすべての変数を、捕捉、ならびに具体的tmp*thisを捕捉するであろう。

この使用例では、ぶら下がっているポインタの可能性が高いため、非同期ハンドラ内で誤ってthisを参照することは危険です。これは起こるのを待っているバグです。

[tmp=*this]は、*thisをキャプチャします。

関連する問題