Структурное связывание
Структурное связывание (англ. 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].
Примечания
- 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) 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.
Источники
- Marc Gregoire. Professional C++ : [англ.]. — Fourth Edition. — John Wiley & Sons, 2018. — ISBN 978-1-119-42130-6.
- Nicolai M. Josuttis. C++17 : The Complete Guide : [англ.]. — 2019. — ISBN 9783967307177.
- John Lospinoso. C++ Crash Course : A Fast-Paced Introduction : [англ.]. — San Francisco : no starch press, 2019. — ISBN 978-1-59327-888-5.
- Mikael Olsson. C++17 Quick Syntax Reference : A Pocket Guide to the Language, APIs and Library : [англ.]. — Third Edition. — Apress, 2018. — ISBN 978-1-4842-3599-7. — doi:10.1007/978-1-4842-3600-0.