Вложенные structured bindings

croessmah
croessmah

На текущий момент нет вложенности в structured binding declarations 

auto [a, b] = pair<int, pair<int, int>>;

b имеет тип pair<int, int>, но хотелось бы иметь возможность изначально создать идентификаторы для std::get<0>(b) и std::get<1>(b):

auto [a, [b, c]] = pair<int, pair<int, int>>;

т.е. внести в синтаксис

attribute-specifier-seq_opt decl-specifier-seq ref-qualifier_opt [ identifier-list ] initializer ;

подобные изменения:

attribute-specifier-seq_opt decl-specifier-seq ref-qualifier_opt [ bindings-list ] initializer ;
bindings-list:
   identifier-list
   
identifier-list_opt [ bindings-list ] identifier-list_opt

17
рейтинг
3 комментария
Дмитрий

Там кажется были конфликты с атрибутами.

Хочется написать 

std::tuple<std::tuple<int, int>> t;
const auto& [[x,y]] = t;

, но двойные квадратные скобки это атрибут, а его сейчас компиляторы вольны игнорировать вообще.

Если не ошибаюсь даже кейс 

std::tuple<std::tuple<int, int>, int> t;
const auto& [[x, y], z] = t;

будет пробовать спарситься как атрибут. 

Дмитрий
m0xf

Чтобы небыло конфликтов, можно ставить пробел между скобками.

m0xf
Даниил Милютин

Было бы здорово...
У меня как раз со structured binding был момент. Поделюсь опытом.
Решил я написать свой zip коллекций. В итоге его успешно взял отсюда

Проблема была в том, что я использовал zip с постоянными коллекциями примерно так :

for(auto x: vec_x)
   do_smth_by_nonconst_ref(x); // ok

// Однако...
for(auto [x,y]: zip(vec_x, vec_y))
   do_smth_by_nonconst_ref(x); // error

Полчается, что семантика нарушается. И причина как раз в том как работает SB.

Вышло так, что zip::iterator при разименовании возващает не tuple значений, а tuple const ссылок. 
Я же семантически хотел такого поведения:

std::tuple<X&, Y&> rxy = ...;
auto [x, y] = rxy;
//=> typeof x is X;
//=> typeof y is Y;
// but the truth is ...
//=> typeof x is X&;
//=> typeof y is Y&;

Вопрос в том как будет в этом случае работать вложенный structured binding?
Если по старинке, то он будет набором ссылок.
Можно было бы внести предлагаемую семантику.

Думаю, мой комментарий тянет на пропозал. 
Нашёл похожий вопрос здесь.
Какие за и против в желаемом поведении?

Даниил Милютин
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения