); их отсутствие меня никогда не беспокоило, но у меня складывается впечатление, что другие люди с энтузиазмом относятся к этому. Конечно, авторы компиляторов могут быть склонны согласиться с вами больше, чем с нами!
арт C ++ 17 вводит новыйструктурированные привязки особенность, которая была изначальнопредложил в 2015 году и чья синтаксическая внешность была широкообсуждается потом.
Некоторые варианты их использования приходят на ум, как только вы просматриваете документацию.
Агрегаты разложения
Давайте объявим кортеж:
std::tuple<int, std::string> t(42, "foo");
Именованные поэлементные копии можно легко получить с помощью структурированных привязок в одну строку:
auto [i, s] = t;
что эквивалентно:
auto i = std::get<0>(t);
auto s = std::get<1>(t);
или же
int i;
std::string s;
std::tie(i, s) = t;
Ссылки на элементы кортежа также можно получить безболезненно:
auto& [ir, sr] = t;
const auto& [icr, scr] = t;
Таким образом, мы можем делать с массивами или структурами / классами, все члены которых являются публичными.
Несколько возвращаемых значений
Удобный способ получить множественные возвращаемые значения из функции немедленно следует из приведенного выше.
Что еще?
Можете ли вы предоставить некоторые другие, возможно, менее очевидные варианты использования для структурированных привязок? Как еще они могут улучшить читаемость или даже производительность кода C ++?
Примечания
Как уже упоминалось в комментариях, в текущей реализации структурированных привязок отсутствуют некоторые особенности. Они не являются переменными, и их синтаксис не позволяет явно пропускать агрегирующие элементы.Вот можно найти дискуссию о вариативности.