Чаепитие из rvalue

от автора

Однажды один волшебник нашёл восхитительное заклинание. Берёшь два чашки, в одной из которых чай.

  • Ставишь на заколдованные блюдца на заколдованной скатерти.
  • Говоришь на загадочном языке «поставь эту чашку на это блюдце» — указывая сначала на чашку, затем на блюдце.
  • И перед нами стоит две чашки чая, как будто бы чай скопировался. Очень полезное заклинание.

Если скажешь «поставь вот это блюдце на вот эту чашку» — ничего не выйдет. Как можно блюдце поставить на чашку?

Это как в программировании, в команде присвоения указать a = 5 — можно.
А указать, 5 = a — в общем-то, бессмысленно.

Про чашку, конечно, можно сказать «чашка вот с этого блюдца», и указать на блюдце. И тоже всё сработает. Это как a = b. Но, указывая куда ставить, нужно говорить именно о блюдце. И вообще, все чашки, которые вы не держите в руках, должны иметь соответствующее блюдце, потому что скатерть заколдована — на ней чашки без блюдца опрокидываются.

Ещё задолго до этого открытия уже существовали волшебные чайники — заливаешь туда две чашки чая разного вкуса, а из него получается одна чашка чая нового вкуса. И если до этого было как-то жалко, что чая становится меньше, то после обнаружения заклинания копирования это перестало быть проблемой и стало можно устраивать волшебные чаепития. Вот о них я и расскажу.

Блюдца заколдованы так что принадлежат своим хозяевам. То есть, надо приходить на чаепитие со своими блюдцами. И милая особенность в том, что как только гость встаёт из-за стола и выходит на улицу, все блюдца оказывается у него с собой. Очень удобно.

Обычно гость приходит, садится, достаёт свои блюдца и ему на них копируют чашки чая. Наверное, лучше сказать «переливают» — такое название привычней. Он чай пробует, оценивает. И решает угостить хозяйку в ответ. Он в волшебный чайник заливает с одной стороны чай, который он сейчас пробовал, с другой стороны тот чай, который принёс с собой, и полученный чай «переливает» в чашку хозяйки. Точнее, в чашку на блюдце хозяйки. И в целом, всё. Он и угостился и угостил, может уходить. Прямо как функция в программе, обработала аргументы, вернула результат — и свободна.

Но можно заметить, что чем больше чашка, тем дольше переливание. А есть и такие люди, которые торопятся.

Для них можно вспомнить, что вместо переливания можно передавать чай в чашке прямо на блюдце. Это быстрее — хозяйка даёт чай на своём блюдце, гость пробует, смешивает со своим чаем, возвращает хозяйке чай на том же блюдце и может быть свободен. Напоминает передачу в функцию аргументов по ссылке. f(Type & arg).

Функция может даже и без аргументов возвращать значение по ссылке. Type & f(). Это как если бы гость после того как произвёл в чайнике новый вкус, отдал бы его хозяйке на своём блюдце. А потом бы встал из-за стола, вышел на улицу, пошёл бы дальше, а из дома раздался бы возглас ужаса хозяйки — блюдце гостя со стола исчезло, волшебная скатерть перевернула чашку без блюдца. Теперь там большая лужа. Попили чай, называется.

Волшебника, который придумывает заклинания, попросили придумать что-нибудь, чтоб такого не случалось, и он сделал даже больше.

На загадочном языке блюдце называется lvalue, а чашка rvalue. А волшебник добавил в заклинения ещё слово xvalue. Это слово тоже означает «чашка», но такая чашка, которая обязательно находится на таком блюдце, которое принадлежит хозяйке. Точнее, тому кому будет отдано. Получается, тут ещё магия предвиденья. И тогда гостю не обязательно «переливать» чай, чтобы возвратить хозяйке. Достаточно чтобы блюдце, которое он оставит, таким образом передарилось.

Кроме того, волшебник для удобства создал целостное заклинание угощения. И ещё добавил возможность помечать блюдца меткой «X», «чай можете забрать». Такие сразу образуются под чайником. Это как добавить rvalue-ссылки в программировании f(Type && a). О, и название у ссылок даже такое же. Забавное совпадение.

Угощение происходит так: заклинания надо произносить с обеих сторон. Гость говорит, как он примет чай: через «переливание» f(T arg), или вместе с блюдцем f(T & arg), или обменявшись f(T && arg). Можно пообещать не пить из чашки. f(const T & arg). А хозяин указывает на чашку — на обычном блюдце или помеченном. И происходит процесс. Быстрее всего происходит передача хозяйского блюдца, на втором месте обмен с помеченным блюдцем. Обмена с блюдцем, которое не помечено, у гостя таким образом не получится, потому что именно пометка «чай можете забрать» и составляет разрешение хозяина на такой обмен. Наверняка, в заклинании установки метки встречается слово move. По крайней мере, в программировании используется именно это слово.

На одно чаепитие пришёл гость не один, а с двумя детьми. Он хотел узнать, как в деталях работает заклинание, ведь его дети сели на одно место, но блюдца у них были свои. Один ребёнок сказал «мне передать на блюдце», другой «а мне обмен». Гость сам у хозяина получил чашку через обмен. И заметил следующее: если просто говорить «тоже обмениваюсь с детьми», то чашка на блюдце уходит первому ребёнку, а если говорить «с этого блюдца чай можете забирать» и затем «обмениваюсь с детьми», то обмен происходит со вторым.

Ещё гость заметил, что если своё блюдце передать первому ребёнку, тот может его отдать кому-нибудь «и когда мы уйдём, может случиться ещё одна лужа». Но если хозяин передал чай на своём блюдце, то быстрее и вполне безопасно его передавать первому ребёнку, а не обмениваться со вторым. То есть, в этом случае добавлять пометку «чай с блюдца можно взять» не нужно.

А если хозяин вдруг запретит пить из чашки, то передать детям нужно с таким же запретом. Тогда чай получит тот ребёнок, который согласится сам себе «перелить», оставив в хозяйской чашке то что там было.

Помнится, гость тоже оказался колдуном, он начал колдовать заклинание «шаблон». И вставлял фразы заклинаний обмена с хозяином и с детьми. Только, там где надо было решать, вставлять ли move, он сказал forward<T>. И на месте гостя появился какой-то дубль. Он брал чай у хозяина таким образом каким было удобно хозяину, и передавал детям самым подходящим образом. Интересно то что у «шаблона» в заклинании запрос на обмен хоть и был обменом, f(T && arg), но когда хозяин предлагал забрать чашку с блюдцем, то передача всё равно срабатывала. Колдун на вопрос «почему так?» сказал, что у «шаблона» (T=type&)&& значит type&, & && -> &. Я этот магический язык знаю и мне всё сразу стало ясно.

Пойду сам чай попью.


ссылка на оригинал статьи https://habr.com/ru/post/683652/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *