Лямбды в C++. Как это работает

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Рассмотрим такой пример кода:
void f(int i)
{
    auto g = [i](auto j)
    {
        return i + j;
    };
    g = [i](auto j)
    {
        return i - j;
    };
    g(1);
}

При компиляции возникнет ошибка в строке g = [i](auto j).

Почему так происходит?

Дело в том, что лямбды в C++ — это всего-лишь синтаксический сахар над локальными классами/структурами с определённым [возможно шаблонным] оператором "скобки":
class Lambda1
{
    int i;

public:
    Lambda1(int i) : i(i) {}

    template <class Ty> auto operator()(Ty j)
    {
        return i + j;
    }
};

class Lambda2
{
    int i;

public:
    Lambda2(int i) : i(i) {}

    template <class Ty> auto operator()(Ty j)
    {
        return i - j;
    }
};

void f(int i)
{
    auto g = Lambda1(i);
    g = Lambda2(i);
    g(1);
}

Теперь причина ошибки [в строке g = Lambda2(i);] становится очевидной: Lambda1 и Lambda2 — это различные классы, которые ничего не знают друг о друге.

Данные классы пришлось сделать глобальными, т.к. C++ всё ещё не поддерживает шаблонные методы в локальных классах.
В будущих версиях C++ вполне валидно будет писать так:
void f(int i)
{
    class Lambda1
    {
        int i;

    public:
        Lambda1(int i) : i(i) {}

        template <class Ty> auto operator()(Ty j)
        {
            return i + j;
        }
    };
    auto g = Lambda1(i);
    class Lambda2
    {
        int i;

    public:
        Lambda2(int i) : i(i) {}

        template <class Ty> auto operator()(Ty j)
        {
            return i - j;
        }
    };
    g = Lambda2(i);
    g(1);
}

И в заключение.
Чтобы приведённые примеры кода скомпилировались достаточно заменить auto g на std::function<int(int)> g.
(Как работает std::function — это уже тема для отдельной статьи.)
Источник: https://habr.com/ru/post/691028/


Интересные статьи

Интересные статьи

Почему команда косячит и что-то идет не так? Мы задались этим вопросом и ретроспективно посмотрели на последний год работы. В этой статье я, Артем Салеев, руководитель backend-направления, расскажу о ...
В крупнейших китайских IT-компаниях действует система наблюдения под названием Ди Сан Цзи Янь, «Третий глаз». Она получает данные из камер в офисах и из ноутбуков каждого человека, чт...
Статья расскажет о том, как с помощью kconfig hardened check можно проверить настройку механизмов защиты ядра ОС Linux, которые используются для противодействия эксплойта...
В 2020 году многие россияне впервые столкнулись с QR-кодами — сначала они были нужны для регистрации выхода из дома, затем для входа в бар или клуб. Технология проста в использовании, но ...
От скорости сайта зависит многое: количество отказов, брошенных корзин. Согласно исследованию Google, большинство посетителей не ждёт загрузки больше 3 секунд и уходит к конкурентам. Бывает, что сайт ...