Ответ 1
Как отмечает cppreference, часть объявления, предшествующего [
(т.е. auto
в вашем случае), не относится к введенные идентификаторы. Вместо этого он применяется к скрытой переменной, которая создается компилятором под обложками. Ваше объявление структурированной привязки
auto [x, y] = std::tie(a, b);
примерно эквивалентен
auto e = std::tie(a, b);
decltype(std::get<0>(e)) x = std::get<0>(e);
decltype(std::get<1>(e)) y = std::get<1>(e);
Как вы можете видеть, auto
применяется к скрытой переменной e
, а не к объявлению x
и y
. Тип e
равен std::tuple<int&, int&>
, а decltype(std::get<1>(e))
дает вам int&
.