#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;
}
В этой простой программе вектор integers
отправляется в лямбда-функцию путем копирования, поэтому он не изменяется после создания этой лямбда-функции.
Теперь, как мне уничтожить/очистить этот вектор в тот же момент, когда он был отправлен в эту лямбда-функцию? Например, когда вектор отправляется в функцию с помощью 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();
Но даже в этом случае вектор все равно очищается ПОСЛЕ создания лямбда-функции.
Итак, как мне уничтожить этот вектор в момент создания лямбда-функции?
Передать это как аргумент вместо того, чтобы зафиксировать?
С другой стороны, если вам не нужно хранить функцию где-то еще (например, в качестве обратного вызова в классе), то std::function
не нужен. В этом случае просто используйте вычет типа auto
.
Кроме того, auto mylambda = [](){/* your code*/};
— это альтернатива сокращению, если вы хотите вызвать лямбду, как в mylambda()
.
Вы будете смеяться, но [integers=std::move(integers)]
. демо
Какую реальную и основную проблему вам необходимо решить? Как вы думаете, почему «уничтожение» вектора при создании лямбды решит эту проблему? Это очень проблема XY.
@Someprogrammerdude Спасибо за ваш ответ, в моем реальном пользовательском случае такая лямбда-функция отправляется в пул потоков, который принимает только std::function<void()>
задания, поэтому я не вижу простого способа сделать это, кроме создания лямбда-функции.
перемещение от вектора не «уничтожит» вектор. Даже не близко. После этого вектор остается нетронутым, в перемещенном состоянии.
Функция std::move
ничего не перемещает. Он приводит аргумент к ссылочному типу rvalue.
В то время как C++11 допускает только ссылки или скопированные значения в лямбда-захватах, в 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;
}
vector size (in main()): 0 vector size (in lambda function): 3
почему вы хотите уничтожить исходный вектор?