ラムダをコールバック関数として使用し、ラムダを作成するときに、参照によってローカル関数変数を取得するとします。ここで、ラムダオブジェクトが、そのローカル関数変数が範囲外になるまで実行されないとします。何が起こるのですか?参照によってローカル変数を取得して範囲外になるとどうなりますか?
私はそれが起こる可能性があるなら誰かがそうするのはかなりばかげているだろうが、私は誰かがそれをやることになるということはほぼ肯定的だと思います。
ラムダをコールバック関数として使用し、ラムダを作成するときに、参照によってローカル関数変数を取得するとします。ここで、ラムダオブジェクトが、そのローカル関数変数が範囲外になるまで実行されないとします。何が起こるのですか?参照によってローカル変数を取得して範囲外になるとどうなりますか?
私はそれが起こる可能性があるなら誰かがそうするのはかなりばかげているだろうが、私は誰かがそれをやることになるということはほぼ肯定的だと思います。
はい、これはぶら下がっている参照の後になります。インターフェイス設計について心配しているように聞こえます。「誰かがやってしまうのはほぼ肯定的です。ラムダとstd::function
を拒否しないでください。これは他の方法よりも危険ではありません。 LambdaはローカルFunctorを定義する単純な方法です。 std::function
は、永続的な多型ファンクタ、ラムダ、またはラムダに最適なインターフェイスです。
スコープの問題は、値でキャプチャする方が簡単な理由です。 &
を書かない限り、ユーザーは参照を取得しません。もちろん、危険性は[&]
ですべてのラムダ関数を開始するという習慣になるだろう。なぜなら、参照は「より速い」からである。そのような人はすぐに十分にレッスンを学ぶことを願っています。
ローカル変数への参照を返すと同じことが起こります:未定義の動作。
私はC++ 11に精通していませんが、私が使用した他の言語では、定義によって変数をキャプチャすることは、キャプチャされている限り範囲外にならないことを意味します([間接参照]を参照)。 –
C++にはありません。ローカル変数を参照で取得するラムダを返すと、囲み関数が返ってから参照が有効にならなくなります。未定義の動作が続く –
関数自体は静的なので、常に有効です。しかし、 'void(**)()' *はぶら下がります。ほかに何か? –