У изменчивой лямбды есть свои собственные копии захваченных значений? - PullRequest
1 голос
/ 22 апреля 2019
std::function<void()> create_function (args...)
{
    int x = initial_value (args...);

    return [x] () mutable
    {
        std::cout << x++ << std::endl;
    };
}

Я обнаружил, что мне нужно ключевое слово mutable для лямбды, в противном случае x является константой.

Если я вызову create_function несколько раз, каждый из возвращаемых функциональных объектов будет иметь свою собственную копиюx или это общий доступ?

Чтобы уточнить: если бы я хотел такой функциональности до C ++ 11, мне пришлось бы написать класс для инкапсуляции захвата, и в этом случае у меня было бывыбор сделать x переменной-членом или глобальной / статической.Если x является константой, это не имеет значения.Как язык определяет хранение x в отношении разных экземпляров лямбды?

1 Ответ

3 голосов
/ 22 апреля 2019

mutable не изменяется, если зафиксированные значения являются значениями или ссылками. Это только меняет постоянство.

Вы указываете, хотите ли вы значения (копии) или ссылки в лямбда-захвате:

return [x] () mutable  // copies
{
    std::cout << x++ << std::endl;
};

return [&x] () mutable  // references
{
    std::cout << x++ << std::endl;
};

Лямбда-захваты всегда моделируются как нестатические элементы данных, если это было вашей путаницей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...