Почему авто, казалось бы, выводит ссылку при использовании структурированных привязок?

Рассмотрим следующий код, который использует структурированные привязки из С++ 17:

int a = 0, b = 0;
auto [x, y] = std::tie(a, b);
y = 1;
std::cout << a << ' ' << b << '\n';

Поскольку я использовал auto, я ожидал бы, что код будет печатать 0 0, поскольку y должен быть копией. Однако он печатает 0 1. Зачем? Я думал, что голый auto никогда не выводит ссылку.

Ответ 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&.