Однажды один волшебник нашёл восхитительное заклинание. Берёшь два чашки, в одной из которых чай.
- Ставишь на заколдованные блюдца на заколдованной скатерти.
- Говоришь на загадочном языке «поставь эту чашку на это блюдце» — указывая сначала на чашку, затем на блюдце.
- И перед нами стоит две чашки чая, как будто бы чай скопировался. Очень полезное заклинание.
Если скажешь «поставь вот это блюдце на вот эту чашку» — ничего не выйдет. Как можно блюдце поставить на чашку?
Это как в программировании, в команде присвоения указать 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/
Добавить комментарий