Daily bit(e) C++. Структурированные привязки

Добавлено 27 октября 2026 в 23:32

Daily bit(e) C++ 162, структурированные привязки в C++17.

Daily bit(e) C++

Структурированные привязки были представлены в стандарте 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!"

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование