Приветствую. Чувствую себя идиотом :), несколько часов читаю справочник https://en.cppreference.com/w/cpp/language/structured_binding и не могу въехать.
A structured binding declaration first introduces a uniquely-named variable (here denoted by e) to hold the value of the initializer, as follows:
*If expression has array type A and no ref-operator is present, then e has type cv A, where cv is the cv-qualifiers in the cv-auto sequence, and each element of e is copy- (for (1)) or direct- (for (2,3)) initialized from the corresponding element of expression.
*Otherwise e is defined as if by using its name instead of [ identifier-list ] in the declaration.
Сначала вводится переменная e, а что означает подчёркнутое ну вот никак не пойму, по-моему, бред какой-то.
Едем дальше - связывание с tuple-like типом:
For each identifier, a variable whose type is «reference to std::tuple_element<i, E>::type» is introduced: lvalue reference if its corresponding initializer is an lvalue, rvalue reference otherwise.
Т.е. для каждого идентификатора создаётся ссылка (lvalue или rvalue), давайте проверим
std::tuple<int> t{};
auto [a] = t;
cout << is_reference<decltype(a)>() << endl; // cout: 0