cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Вложенные structured bindings #384

Open Neargye opened 3 years ago

Neargye commented 3 years ago

Перенос предложения: голоса +23, -2 Автор идеи: Александр

На текущий момент нет вложенности в 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
Neargye commented 3 years ago

Дмитрий 28 марта 2019, 11:23 Там кажется были конфликты с атрибутами.

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

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 31 марта 2019, 21:52 Чтобы небыло конфликтов, можно ставить пробел между скобками.

Даниил Милютин 2 апреля 2019, 1:48 Было бы здорово... У меня как раз со 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? Если по старинке, то он будет набором ссылок. Можно было бы внести предлагаемую семантику.

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