私の経験から、次のいずれかのようです。
- 関数呼び出し内で作成されたラムダ式は、呼び出しの直後に破棄されます
- を期待する関数を呼び出す
std::function
と、ラムダから一時オブジェクト(std :: function)が作成され、そのオブジェクトは呼び出し後に破棄されます
この動作は、次のコードスニペットで確認できます。
const function<void()>* pointer;
void a(const function<void()> & f)
{
pointer = &f;
}
void b()
{
(*pointer)();
}
int main()
{
int value = 1;
std::cout << &value << std::endl;
// 1: this works
function<void()> f = [&] () { std::cout << &value << std::endl; };
a(f);
// 2: this doesn't
a([&] () { std::cout << &value << std::endl; });
/* modify the stack*/
char data[1024];
for (int i = 0; i < 1024; i++)
data[i] = i % 4;
b();
return 0;
}
2番目のケースで実際に何が起こっているのでしょうか。a()
明示的なstd::function
オブジェクトを作成せずに呼び出す正しい方法はありますか?
編集::この両方のバージョン(1と2)は正しくコンパイルされますが、出力が異なります。
バージョン1:
0x7fffa70148c8
0x7fffa70148c8
バージョン2:
0x7fffa70148c8
0