您的问题中有两个问题:
- 我可以提前声明自动变量吗(在初始化之前)
- 如何存储 lambda 函数
第一个问题的答案是“否”:自动变量的声明必须伴随着初始化。你不能有:
auto x; // error
x = 42;
本身,因为编译器不会在声明中知道 x 应该是什么。另一方面:
auto x = 42;
是有效的,因为42是int,所以编译器为x分配一个整数
对于第二个问题,使用 std::function。它已尽可能优化。有一些细节需要考虑。具体来说:代码块 <code> 是否引用了 lambda 函数范围之外的变量。如果是这样,您是否希望它按值或按引用引用这些变量。所有这些变量都必须存储在某个地方(也称为捕获),这就是 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> }
最后,正如其中一位评论者指出的那样,如果您没有捕获,最好的办法是简单地将 <code> 代码分解为一个函数,然后简单地稍后调用它。