lambda capture + structured binding
От: Кодт Россия  
Дата: 29.06.21 12:44
Оценка: 13 (3)
Маленький вотзефак из тонкостей стандарта.

Рассмотрим вот такой код
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."

Или я чего-то не понимаю?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.