Я хотел знать, что такое 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
).