Почему structured binding может неожиданно копировать данные? В C++… — C/C++ Ready | Программирование — TG.ME

Почему structured binding может неожиданно копировать данные?

В 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&.

📣 C++ Ready | #совет
❤6👍4🔥4
August 31, 2026 1.1K 1 9