В C++ structured binding удобно распаковывает пары, tuple и элементы map:
auto item = std::pair{1, std::string("ready")};
auto [id, name] = item;Но здесь
id и name это копии значений из item.Если изменить
name, исходная пара не изменится:name = "cpp";
std::cout << item.second; // ready
Для маленьких чисел это неважно, но для строк, векторов и больших объектов можно получить лишние копирования.
Если нужно работать с исходными значениями, используй ссылку:
auto& [id, name] = item;
name = "cpp";
Теперь меняется сам объект:
std::cout << item.second; // cpp
То же самое часто встречается при обходе map:
for (auto [key, value] : users) {
value.active = false;
}Такой код меняет копию value, а не элемент внутри map.
Правильно, если нужно менять данные:
for (auto& [key, value] : users) {
value.active = false;
}А если нужно только читать без копий:
for (const auto& [key, value] : users) {
std::cout << key << value.name;
}Structured binding удобная штука. Для реальных данных чаще нужны
auto& или const auto&.


