#include <iostream>
#include <functional>
int main() {
std::vector<int> integers = {0, 1, 2};
std::function<void()> lambda = [integers] {
printf("vector size (in lambda function): %zu\n", integers.size());
};
printf("vector size (in main()): %zu\n", integers.size());
lambda();
return 0;
}
在这个简单的程序中,vectorintegers
通过复制的方式被送入一个 lambda 函数中,因此在这个 lambda 函数创建之后它就不会改变。
现在,如何在将向量发送到此 lambda 函数的同一时刻销毁/清除它?就像将向量发送到函数时一样std::move()
?
我目前最接近的解决方案是实现上述目标:
std::vector<int> integers = {0, 1, 2};
std::function<void()> lambda = [integers] {
printf("vector size (in lambda function): %zu\n", integers.size());
};
integers.clear();
printf("vector size (in main()): %zu\n", integers.size());
lambda();
但即便如此,在创建 lambda 函数之后,向量仍然会被清除。
那么,如何在 lambda 函数创建时销毁这个向量呢?
9
最佳答案
1
尽管 C++11 仅允许在 lambda 捕获中使用引用或复制值,但 C++14 引入了。您可以在其中一个表达式中移动向量。
#include <cstdio>
#include <functional>
#include <utility>
int main() {
std::vector<int> integers = {0, 1, 2};
std::function<void()> lambda = [integers=std::move(integers)] {
// Initializing move ^^^^^^^^^^^^^^^^^^^^
std::printf("vector size (in lambda function): %zu\n", integers.size());
};
std::printf("vector size (in main()): %zu\n", integers.size());
lambda();
return 0;
}
。
向量大小(在 main() 中):0 向量大小(在 lambda 函数中):3
|
–
–
std::function
。在这种情况下,只需使用auto
类型推断。–
[integers=std::move(integers)]
。–
–
|