Структурное связывание (англ. structured binding) — синтаксическое нововведение стандарта языка программирования C++17[1], предназначенное для распаковки сложных нестатических типов данных и представления их в виде композиции своих составляющих элементов[2][3].
Синтаксис
Структурное связывание является одним из новых вариантов объявления переменных в языке программирования C++[4]. Оно определяет отношение объявляемых переменных с доступными компонентами сложного объекта, который выступает их инициализатором[5]:
optional_attribute qualified_auto optional_reference [ identifier_list ] = expression; // объявление в виде структурного связывания
optional_attribute qualified_auto optional_reference [ identifier_list ] = {expression}; // структурное связывание с инициализацией кортежа
optional_attribute qualified_auto optional_reference [ identifier_list ] = (expression); // структурное связывание для неполного типа
- где:
optional_attribute
— последовательность необязательных атрибутов,
qualified_auto
— ключевое слово auto
с уточнением в виде спецификаторов const
, volatile
и т. п.
optional_reference
— необязательный оператор доступа по ссылке &
или &&
,
identifier_list
— список объявляемых переменных, разделённых запятыми,
expression
— инициализирующее выражение, которое не может быть объединением.
В некотором смысле использование структурного связывания осуществляет декомпозицию инициализатора на его составляющие компоненты[6]. Как следствие, количество переменных, объявляемых с помощью структурного связывания, должно совпадать с числом элементов инициализатора[1].
Описание
Структурное связывание даёт возможность доступа к публичным полям составного объекта, например, после вызова функции, которая возвращает сложный тип данных. Во многих случаях структурное связывание может рассматриваться как удобная альтернатива генерированию исключений[7].
Для улучшения читаемости кода инициализатор со структурным связыванием не возбраняется использовать в заголовочной части операторов if
или for
, где расположена проверка условия[8][9].
Структурное связывание хорошо взаимодействует со стандартными встроенными классами библиотеки STL, например с pair
[10] или с tuple
[11].
Примечания
- ↑ 1 2 Gregoire, 2018, Structured Bindings, p. 26.
- ↑ Lospinoso, 2019, Structured Bindings, p. 222.
- ↑ Olsson, 2018, Returning Multiple Values, p. 64.
- ↑ Lospinoso, 2019, Declaration Statements, p. 213.
- ↑ Structured binding declaration (since C++17) Архивная копия от 8 сентября 2020 на Wayback Machine en.cppreference.com
- ↑ Josuttis, 2019, Structured Bindings, p. 3.
- ↑ Lospinoso, 2019, Alternatives to Exceptions, p. 114.
- ↑ Lospinoso, 2019, Initialization Statements and if, p. 226, 227.
- ↑ Gregoire, 2018, The auditVoterRolls Function, p. 659.
- ↑ Lospinoso, 2019, pair, p. 374.
- ↑ Gregoire, 2018, Structured Bindings, p. 717.
Источники