Open Neargye opened 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? Если по старинке, то он будет набором ссылок. Можно было бы внести предлагаемую семантику.
Думаю, мой комментарий тянет на пропозал. Нашёл похожий вопрос здесь. Какие за и против в желаемом поведении?
Перенос предложения: голоса +23, -2 Автор идеи: Александр
На текущий момент нет вложенности в structured binding declarations
b имеет тип
pair<int, int>
, но хотелось бы иметь возможность изначально создать идентификаторы дляstd::get<0>(b)
иstd::get<1>(b)
:т.е. внести в синтаксис
подобные изменения: