あなたの質問には2つの質問があります:
- 事前に(初期化前に)自動変数を宣言できますか?
- ラムダ関数を保存する方法
最初の質問に対する答えは「いいえ」です。自動変数の宣言は初期化に伴う必要があります。あなたが持つことはできません:
auto x; // error
x = 42;
なぜなら、コンパイラは宣言でxがどうあるべきかを知らないからです。一方で:
auto x = 42;
42はintであるため、有効です。コンパイラはxに整数を割り当てます。
2番目の質問には、std::functionを使用します。可能な限り最適化されています。考慮すべき詳細がいくつかあります。具体的には、コードブロック<code>は、ラムダ関数のスコープ外の変数を参照します。含まれている場合は、それらの変数を値または参照で参照しますか。これらの変数はすべてどこかに格納する必要があり(キャプチャとも呼ばれます)、これがstd::functionの機能です。キャプチャがない場合、std :: functionは基本的に関数への単純なポインタであり、可能な限り最適化されています。ヘッダーには次のものがあります。
// with no capture:
std::function<void()> _myblock;
// if you have capture (say, two integers)
std::function<void(int,int)> _myblock
そしてソースで持っている:
// no capture:
_myblock = []() { <code> }
// with capture:
_myblock = [x,y]( int x, int y) { <code> }
最後に、コメント投稿者の1人が指摘したように、キャプチャがない場合は、<code>コードを関数に分解し、後で呼び出すのが最善の方法です。