Лямбда-выражение создает временный объект (называемый замыканием) неизвестного типа класса. Временные объекты не могут быть назначены неконстантным ссылкам. Это означает, что вам нужно
auto&& getx = [&]() {
return x;
}
, чтобы получить rvalue-ссылку на замыкание, или
auto getx = [&]() {
return x;
}
, чтобы просто получить замыкание.
Это даст код для компиляции, но все еще нужен еще один бит, чтобы сделать возвращаемое значение getx
ссылкой на x
. Для этого вам нужно добавить
auto getx = [&]() -> int& {
return x;
}
// or
auto getx = [&]() -> auto& {
return x;
}
// or
auto getx = [&]() -> decltype(auto) {
return x;
};
Также обратите внимание, что main
должен всегда возвращать int
. Вам следует повысить уровень предупреждения компилятора, чтобы он выдавал ошибку, если вы попытаетесь использовать void main
.