Как я могу std::переместить вектор в лямбда-функцию?

#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();

Но даже в этом случае вектор все равно очищается ПОСЛЕ создания лямбда-функции.

Итак, как мне уничтожить этот вектор в момент создания лямбда-функции?

почему вы хотите уничтожить исходный вектор?

463035818_is_not_an_ai 10.06.2024 15:03

Передать это как аргумент вместо того, чтобы зафиксировать?

Some programmer dude 10.06.2024 15:03

С другой стороны, если вам не нужно хранить функцию где-то еще (например, в качестве обратного вызова в классе), то std::function не нужен. В этом случае просто используйте вычет типа auto.

Some programmer dude 10.06.2024 15:04

Кроме того, auto mylambda = [](){/* your code*/}; — это альтернатива сокращению, если вы хотите вызвать лямбду, как в mylambda().

user2470889189 10.06.2024 15:05

Вы будете смеяться, но [integers=std::move(integers)]. демо

n. m. could be an AI 10.06.2024 15:07

Какую реальную и основную проблему вам необходимо решить? Как вы думаете, почему «уничтожение» вектора при создании лямбды решит эту проблему? Это очень проблема XY.

Some programmer dude 10.06.2024 15:08

@Someprogrammerdude Спасибо за ваш ответ, в моем реальном пользовательском случае такая лямбда-функция отправляется в пул потоков, который принимает только std::function<void()> задания, поэтому я не вижу простого способа сделать это, кроме создания лямбда-функции.

Rahn 10.06.2024 15:09

перемещение от вектора не «уничтожит» вектор. Даже не близко. После этого вектор остается нетронутым, в перемещенном состоянии.

463035818_is_not_an_ai 10.06.2024 15:09

Функция std::move ничего не перемещает. Он приводит аргумент к ссылочному типу rvalue.

user2470889189 10.06.2024 15:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В то время как 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

Другие вопросы по теме