LINUX.ORG.RU

Structured binding

 


0

1

Приветствую. Чувствую себя идиотом :), несколько часов читаю справочник https://en.cppreference.com/w/cpp/language/structured_binding и не могу въехать.

A structured binding declaration first introduces a uniquely-named variable (here denoted by e) to hold the value of the initializer, as follows:
*If expression has array type A and no ref-operator is present, then e has type cv A, where cv is the cv-qualifiers in the cv-auto sequence, and each element of e is copy- (for (1)) or direct- (for (2,3)) initialized from the corresponding element of expression.
*Otherwise e is defined as if by using its name instead of [ identifier-list ] in the declaration.

Сначала вводится переменная e, а что означает подчёркнутое ну вот никак не пойму, по-моему, бред какой-то.
Едем дальше - связывание с tuple-like типом:

For each identifier, a variable whose type is «reference to std::tuple_element<i, E>::type» is introduced: lvalue reference if its corresponding initializer is an lvalue, rvalue reference otherwise.

Т.е. для каждого идентификатора создаётся ссылка (lvalue или rvalue), давайте проверим

   std::tuple<int> t{};
   auto [a] = t;
   cout << is_reference<decltype(a)>() << endl; // cout: 0
Скажите, дело во мне, а все нормальные это понимают?

as if by using its name instead

Может это?

attr(optional) cv-auto ref-operator(optional) <generated-name-of-e> = expression ;
                                              ^^^^^^^^^^^^^^^^^^^^^
xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Может, но я всё равно не очень понимаю. Оно ведь как должно быть (на мой взгляд): если ref-operator перед [] не указали, то объект из expression копируются в e. Но всё сказано какими-то козлячими словами. Логику работы я могу отследить тестами, но мне просто интересно - остальные это чтиво понимают? Или это для какой-то элиты?

pavlick ★★ ()
Ответ на: комментарий от pavlick

Скорее от какой-то элиты, которой себя мнят редакторы cppreference. Я не удивлюсь, если это просто копия текста стандарта, а кто копировал сам толком не понял как оно работает.

остальные это чтиво понимают?

Я – нет. Это надо сидеть и разбираться, чтобы понять эти детали. Первая цитата выглядит как описание различий для массивов и структур и мне не ясно, зачем оно вообще приведено (может они хотели сказать, что массив распадается на его элементы и его как агрегата не существует).

xaizek ★★★★★ ()
Последнее исправление: xaizek (всего исправлений: 2)

дело в том что когда придумали оружие, то даже его автор не думал то им будут чистит козявки или совать его себе в задний проход, по этой причине (слишком умных дураков) в некоторых штатах вводятся спец законы, не делать чего то этакого.
то как вы в извращенной форме выкрутили написанное, не означает что написанное не корректно

anonymous ()
Ответ на: комментарий от anonymous

Я ведь допустил, что могу ошибаться. И чтобы поставить точку - скажите, как следует интерпретировать вторую цитату (про создание ссылки для каждого идентификатора на элементы tuple'а) и почему is_reference говорит, что это не ссылка? Тогда я признаюсь в своей ограниченности и уйду с позором.

pavlick ★★ ()
Ответ на: комментарий от anonymous

Может тогда лор вообще закрыть? Я хотел пообщаться на эту тему именно здесь.

Это, конечно, аргумент, но сложно сказать, что это всё объясняет. Заметьте, что рейтинг у вопроса больше рейтинга ответа. Я бы сказал, что вкрутили какой-то непрозрачный механизм, который нарушает устоявшуюся логику. decltype везде работает одним образом, а там другим, ну супер.

pavlick ★★ ()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

примените свое желание на поговорить в своей жизни, пришли вы в магазин по хлеб, а вам продавец говорит - а давайте поговорим, пришли вы к своему начальнику по зп, а он говорит - а зачем тебе зп ? давай лучше поговорим, итд
вам не нравится формулировка или вы ее не понимаете ? обращайтесь к автору формулировки
вы не можете обратится к автору ? принимайте ее как есть, а ее смысл гуглите

anonymous ()

Даже у компиляторописателей нестыковки с этим структур байндингом https://stackoverflow.com/questions/44698195/is-decltypeauto-for-a-structured-binding-supposed-to-be-a-reference

#include <iostream>
#include <type_traits>
#include <tuple>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto [ a, b ] = tup;
    decltype(auto) e = a;
    std::cout << std::boolalpha << std::is_reference_v<decltype(e)> << std::endl;
}
gcc говорит true, clang false. Только что проверил, компиляторы свежие, а теме уже полтора года! Сначала подумал - здорово, удобно работать с tuple/pair, сейчас уже даже не знаю - зачем эти исключения из правил.

pavlick ★★ ()
Ответ на: комментарий от pavlick

Мда, судя по всему они считают, что binding это не объявление. А то, что в результате этого binging объявляются переменные – деталь реализации.

Ещё может, чтобы более однозначно получать типы. Ведь ссылку на ссылку не сделаешь и будут расхождения (int – ссылка на int, int & – тоже ссылка на int), а если возвращать тип на который биндимся, то таких проблем не должно быть.

xaizek ★★★★★ ()
Ответ на: комментарий от pavlick

заведи себе бабу и говори с ней, а такой писаниной ты только забиваешь интернет

anonymous ()
Ответ на: комментарий от pavlick

а теме уже полтора года!

Какой ужас!

В gcc баги и по 5+ лет висят.

anonymous ()

Сначала вводится переменная e, а что означает подчёркнутое ну вот никак не пойму, по-моему, бред какой-то.

Едрить ты бестолочь. Даже буквальный перевод со словарём ясен, как божий день. e определяется так, как если бы в structured binding-е [ identifier-list ] заменили на e.

Т.е. если был байндинг Placeholder [ identifier-list ] = Expression;, то e определяется как Placeholder e = Expression;

anonymous ()
Ответ на: комментарий от pavlick

Но всё сказано какими-то козлячими словами.

Ну попробуй написать своими словами )))

остальные это чтиво понимают?

Да.

Или это для какой-то элиты?

Ну если любого с ICQ > 80 считать элитой, то да.

anonymous ()
Ответ на: комментарий от xaizek

Я не удивлюсь, если это просто копия текста стандарта, а кто копировал сам толком не понял как оно работает.

Не надо всех судить по себе.

Первая цитата выглядит как описание различий для массивов и структур и мне не ясно, зачем оно вообще приведено

Головой подумай.

anonymous ()
Ответ на: комментарий от pavlick

сейчас уже даже не знаю - зачем эти исключения из правил.

Ну попробую один раз объяснить, хотя, наверное, зря...

Была структура s и в ней мембер i типа int. decltype(s.i) это int. Ты забайндил x к s.i. x делается ссылкой, чтобы не копировать, но байндится к s.i и хорошо бы это отразить в decltype(x).

То, что у байнда такой же тип, как у того, к чему он байндится — это вполне в духе понятия байндинга, не так ли?

anonymous ()
Ответ на: комментарий от xaizek

Ведь ссылку на ссылку не сделаешь и будут расхождения (int – ссылка на int, int & – тоже ссылка на int), а если возвращать тип на который биндимся, то таких проблем не должно быть.

Проблемы со ссылками на ссылки в decltype(e)& v = ...; решаются правилом схлопывания ссылок.

anonymous ()
Ответ на: комментарий от anonymous

то как вы в извращенной форме выкрутили написанное, не означает что написанное не корректно

Слушай, ты совсем недавно заявлял, что я неправильно выкрутил написанное. Оказывается, что выкрутил я его правильно. Так что ты просто пустословишь. Иди мимо.

xaizek, спасибо за ответы.

pavlick ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.