Какова цель этой лямбды? - программирование
Подтвердить что ты не робот

Какова цель этой лямбды?

Я вижу следующую лямбду в коде C++. Какова цель этого?

static const auto faster = [](){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
4b9b3361

Ответ 1

Локальная переменная static инициализируется не более одного раза первым потоком, который выполняет ее объявление. Используя лямбду, мы можем воспользоваться этим фактом для запуска произвольного кода не более одного раза. При первом достижении объявления поток, который его достигает, выполнит код в лямбда-выражении как часть инициализации переменной. Значение переменной предположительно фактически не используется, но программа запомнит, что переменная была инициализирована, поэтому лямбда не будет запущена во второй раз.

Ответ 2

Вы обычно видите этот код в конкурсных конкурсах по программированию для онлайн-судей, которые используют C++ ввод/вывод за кулисами. Чтобы увеличить время выполнения ваших представлений, вы можете развязать потоки и отменить синхронизацию C++ IOStreams из стандартных потоков C. Использование лямбды - удобный способ выполнить код сразу после объявления переменной. Чтобы получить полный эффект от этой оптимизации, она должна быть размещена перед выполнением любого другого кода.

Ответ 3

Это называется немедленной лямбда (IIL).

Сначала объявляется лямбда ([] () {...}), затем сразу же она вызывается (вызывается) (() - сразу после лямбды).

Это можно использовать несколькими способами:

  • инициализировать переменную const сложной логикой
    const auto v = [] () {
        if (...) return X;
        else return Y;
   }
  • инициализировать статическую переменную со сложной логикой

  • вызвать IIL, чтобы создать значение для параметра функции

     auto x = foo(a, b, [c] () {return c > 42;} () );
  • поскольку статические переменные инициализируются на ранней стадии, с использованием статической переменной, значение которой будет игнорироваться, но инициализируется с помощью IIL - ее можно использовать для выполнения действий перед выполнением main.