Как сделать const некоторыми членами из изменяемого списка захвата лямбды? - PullRequest
0 голосов
/ 30 декабря 2018

mutable лямбда может изменять значения членов своего списка захвата (которые были захвачены по значению).Есть ли способ заставить некоторые члены списка захвата остаться const в mutable лямбде?

Например, я хочу изменить i, но иметь const j в теле lambda in следующий пример кода :

#include <iostream>

int main()
{
    int i = 42;
    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };

    lambda();
}

1 Ответ

0 голосов
/ 30 декабря 2018

Поскольку простые захваты имеют точный, cv-квалифицированный тип того, что они захватывают, вы можете сделать внешнюю переменную const и, таким образом, получить постоянный захват:

#include <iostream>

int main()
{
    const int i = 42;
//  ^^^^^

    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };

    lambda();
}

Конечно, если вам нужночтобы изменить внешнюю переменную в какой-то момент, вам сначала нужно сделать ее копию или каким-то образом изменить ее код, чтобы сделать ее немного более аккуратной.

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