Маленький вотзефак из тонкостей стандарта.
Рассмотрим вот такой код
auto foo() { return std::pair{1, 2}; }
auto bar() {
auto [x, y] = foo();
auto z = 3;
return [x, z]() { return x + z; }
}
int main() {
return bar()();
}
gcc компилирует, clang ругается.
Полез в багзиллу, нашёл тикет 2018 года —
https://bugs.llvm.org/show_bug.cgi?id=39125
Резолюция: resolved invalid.
Со ссылкой на стандарт:
http://eel.is/c++draft/expr.prim.lambda#capture-8
"If a lambda-expression explicitly [...] captures a structured binding (explicitly or implicitly), the program is ill-formed."
Судя по комменту, раньше в стандарте прямо говорилось, что структурные биндинги нельзя захватывать. В современной редакции этого нет, — и более того,
http://eel.is/c++draft/basic.def.odr#5
"A structured binding is odr-used if it appears as a potentially-evaluated expression."
Или я чего-то не понимаю?