Простая лямбда-функция, которую я не мог понять - PullRequest
0 голосов
/ 04 декабря 2018

Я изучаю C ++ 14 лямбд с const, и сегодня мой друг показал мне следующее.Я не мог этого понять.

  1. Это лямбда-функция?Синтаксис не совпадает с тем, что я вижу обычно.

  2. , синтаксис совпадает с лямбда-функцией, но происходит сбой с длинной ошибкой.

int main()
{
    // 1.
    const auto x = [&]{
        auto l = 0;
        l = 99;
        return l;
    }();

    std::cout << x << endl;

    // 2.    
    const auto y = [&](){
        auto l = 0;
        l = 99;
        return l;
    };

    std::cout << y << endl;   

    return 0;
}

Я хочу знать, что такое 1 и почему 2 не компилируется.

1 Ответ

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

Я хотел знать, что такое 1. и почему 2. не компилируется.

(1)

const auto x = [&]{
        auto const_val = 0;
        const_val = 99;
        return const_val;
    }();
// ..^^  <--- execution

Это определение и выполнение лямбды, которая не получает аргументы (поэтому часть () после [&] является необязательной и в данном случае опускается).

Так что x является int (a const int) инициализируется с помощью 99 (значение, возвращаемое лямбда-выражением)

Как видите, имя const_val для целочисленной переменной внутри лямбда-выражения является подделкой, поскольку переменнаяинициализируется с помощью 0 и затем модифицируется, присваивая ему значение 99.

(2)

const auto y = [&](){
auto l = 0;
l = 99;
return l;
};

Это только определение (без выполнения) лямбды, которая получаетбез аргументов.

Итак, y - это переменная (ну, константа), которая содержит лямбду, и когда вы пишете

std::cout << y << endl; 

, вы получаете ошибку, потому что не определен выводдля лямбды;вы должны попытаться с помощью

std::cout << y() << endl;

выполнить лямбду и вывести возвращаемое значение (снова 99).

...