Структурное связывание

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Структурное связывание (англ. 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. 1 2 Gregoire, 2018, Structured Bindings, p. 26.
  2. Lospinoso, 2019, Structured Bindings, p. 222.
  3. Olsson, 2018, Returning Multiple Values, p. 64.
  4. Lospinoso, 2019, Declaration Statements, p. 213.
  5. Structured binding declaration (since C++17) Архивная копия от 8 сентября 2020 на Wayback Machine en.cppreference.com
  6. Josuttis, 2019, Structured Bindings, p. 3.
  7. Lospinoso, 2019, Alternatives to Exceptions, p. 114.
  8. Lospinoso, 2019, Initialization Statements and if, p. 226, 227.
  9. Gregoire, 2018, The auditVoterRolls Function, p. 659.
  10. Lospinoso, 2019, pair, p. 374.
  11. Gregoire, 2018, Structured Bindings, p. 717.

Источники[править | править код]