Читаем Язык программирования C++. Пятое издание полностью

• тип-член type класса remove_reference будет иметь тип string;

• типом возвращаемого значения функции move() будет string&&;

• у параметра t функции move() будет тип string&&;

Соответственно, этот вызов создает экземпляр move, являющийся следующей функцией:

string&& move(string &&t)

Тело этой функции возвращает тип static_cast(t). Типом t уже является string&&, поэтому приведение не делает ничего. Следовательно, результатом этого вызова будет ссылка на r-значение, которое было дано.

Теперь рассмотрим второе присвоение, которое вызывает функцию std::move(s1). В этом вызове аргументом функции move() является l-значение. Поэтому на сей раз:

• выведенным типом Т будет string& (ссылка на тип string, а не просто string);

• следовательно, экземпляр шаблона remove_reference создается с типом string&;

• тип-член type класса remove_reference будет иметь тип string;

• типом возвращаемого значения функции move() все еще будет string&&;

• параметр t функции move() будет создан как экземпляр string& &&, который сворачивается в string&.

Таким образом, этот вызов создает экземпляр шаблона move, который является точно тем, что необходимо для связи ссылки на r-значение с l-значением.

string&& move(string &t)

Тело этого экземпляра возвращает тип static_cast(t). В данном случае типом t является string&, который приведение преобразует в тип string&&.

Оператор static_cast поддерживает приведение l-значения к ссылке на r-значение

Обычно оператор static_cast может выполнить только доступные преобразования (см. раздел 16.3). Однако для ссылок на r-значение есть специальное разрешение: даже при том, что нельзя неявно преобразовать l-значение в ссылку на r-значение, используя оператор static_cast, можно явно привести l-значение к ссылке на r-значение.

Привязка ссылки на r-значение к l-значению создает код, который работает с разрешением ссылке на r-значение заменять l-значение. Иногда, как в случае с функцией reallocate() класса StrVec (см. раздел 13.6.1), известно, что замена l-значения безопасна. Разрешая осуществлять это приведение, язык позволяет его использование. Вынуждая использовать приведение, язык пытается предотвратить его случайное использование.

И наконец, хотя такие приведения можно написать непосредственно, намного проще использовать библиотечную функцию move(). Кроме того, использование функции std::move() существенно облегчает поиск в коде места, потенциально способного заменить l-значения.

Упражнения раздела 16.2.6

Упражнение 16.46. Объясните, что делает этот цикл из функции StrVec::reallocate() (раздел 13.5):

for (size_t i = 0; i != size(); ++i)

 alloc.construct(dest++, std::move(*elem++));

<p><image l:href="#books.png"/>16.2.7. Перенаправление</p>

Некоторые функции должны перенаправлять другим функциям один или несколько своих аргументов с неизменными типами. В таких случаях необходимо сохранить всю информацию о перенаправленных аргументах, включая то, является ли тип аргумента константой и является ли аргумент l- или r-значением.

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

// шаблон, получающий вызываемое выражение и два параметра

// вызывает предоставленное выражение с "обращенными" параметрами

// flip1 - неполная реализация: спецификатор const верхнего уровня и

// ссылки теряются

template

void flip1(F f, T1 t1, T2 t2) {

 f(t2, t1);

}

Этот шаблон работает прекрасно, пока он не используется для вызова функции со ссылочным параметром:

void f(int v1, int &v2) // обратите внимание, v2 - ссылка

{

 cout << v1 << " " << ++v2 << endl;

}

Здесь функция f() изменяет значение аргумента, привязанного к параметру v2. Но если происходит вызов функции f() через шаблон flip1, внесенные функцией f() изменения не затронут первоначальный аргумент:

f(42, i);        // f() изменяет свой аргумент i

flip1(f, j, 42); // вызов f() через flip1 оставляет j неизменным

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных