ラムダ関数と変数をキャプチャするメカニズムを理解するのに苦労しているので、少しテストを行って、本当に奇妙な結論に達しました。あれは:
class ClassA
{
public:
std::function<void()> lambda;
void DoYourStuff()
{
int x;
x = 1;
lambda = [=] () { printf("A %d\n", x);};
lambda();
x = 2;
lambda();
}
};
class ClassB
{
public:
std::function<void()> lambda;
int x;
void DoYourStuff()
{
x = 1;
lambda = [=] () { printf("B %d\n", x);};
lambda();
x = 2;
lambda();
}
};
注:違いはx変数の配置のみです。ClassAとClassBの関数の出力は異なります。
A 1
A 1
B 1
B 2
だから私の質問は:
- これは望ましい動作ですか?
- ClassAで[=]の代わりに[&]を使用した場合、それらのラムダは同一でしょうか?
- [=]が実際にいつコピーを作成するかについての一般的なルールはありますか?
- ラムダによる変数のキャプチャはいつ発生するはずですか?
- ラムダに変数の再キャプチャを強制することはできますか?
ありがとう