Daily bit(e) C++. Структурированные привязки
Добавлено 27 октября 2026 в 23:32
Daily bit(e) C++ 162, структурированные привязки в C++17.

Структурированные привязки были представлены в стандарте C++17.
Они позволяют выполнять декомпозицию массивов, кортежей и нестатических членов данных класса, представляя их в виде именованных идентификаторов.
Исходный объект захватывается согласно стандартным правилам вывода типов для auto; при этом идентификаторы фактически выступают в роли прозрачных ссылок на захваченный объект.
#include <unordered_set>
#include <string>
struct UserType
{
int a;
double b;
std::string c;
};
// Типовой сценарий использования структурированных привязок -
// распаковка пары, возвращаемой некоторыми операциями
// стандартной библиотеки
std::unordered_set<int> data{1, 2, 3, 4, 5};
if (auto [it, inserted] = data.insert(4); inserted)
{
// вставка произошла
// it указывает на только что вставленный элемент
}
else
{
// вставка не произошла
// it указывает на существующий элемент
}
// По-прежнему действуют стандартные правила
// вывода типов для auto
std::pair a{10,20}; // изменяемая
const std::pair b{10,20}; // неизменяемая
auto [i,j] = a; // Захват копированием
i = 0; j = 0; // OK
// a.first == 10, a.second == 20
auto &[k,l] = a; // Захват по ссылке
k = 0; l = 0; // OK
// a.first == 0, a.second == 0
auto &[m,n] = b; // Захват по ссылке, auto выведет const
// m = 0; j = 0; // Не OK, нельзя изменить переменную только для чтения
UserType u{42, 3.14, "Hello World!"};
// Декомпозиция агрегата
auto &[x,y,z] = u;
// x == 42, y == 3.14, z == "Hello World!"
