Читать «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» онлайн - страница 225

Скотт Мейерс

15

Непереводимая игра слов, основанная на использовании для обычного указателя названия “raw pointer” (дословно — “сырой указатель”). — Примеч. пер.

16

В разделе 5.3 поясняется, что к универсальным ссылкам почти всегда может применяться std::forward, так что, когда эта книга готовилась к печати, некоторые члены сообщества С++ начинали именовать универсальные ссылки передаваемыми ссылками.

17

Такими локальными объектами являются большинство локальных переменных (например, такие как w в makeWidget), а также временные объекты, создаваемые как часть инструкции return. Параметры функции на такое звание претендовать нс могут. Некоторые программисты различают применение RVO к именованным и неименованным (т.e. временным) локальным объектам, ограничивая термин “RVO” неименованными объектами и называя его применение к именованным объектам оптимизацией именованных возвращаемых значений (named return value optimization — NRVO).

18

Известная история о том, что об одном и том же до средины наполненном стакане пессимисты говорят, что он наполовину пуст, а оптимисты — что он наполовину полон. — Примеч. пер.

19

Здесь предполагается, что битовые поля располагаются от младшего бита к старшему. С++ это не гарантирует, но компиляторы часто предлагают механизм, который позволяет программисту управлять схемой размещения битовых полей.

20

std::bind всегда копирует свои аргументы, но вызывающий код может добиться эффекта сохранения аргумента по ссылке путем применения std::ref. Результат вызова

auto compressRateB = std::bind(compress, std::ref(w), _1);

состоит в том. что compressRateB действует так, как если бы сохранялась ссылка на объект w, а не его копия.

21

В предположении, что таковая имеется. В некоторых встроенных системах ее нет.

22

Это упрощение. Значение имеет не фьючерс, для которого вызывается get или wait, а совместно используемое состояние, на которое ссылается фьючерс. (В разделе 7.4 обсуждается взаимосвязь фьючерсов и совместно используемых состояний.) Поскольку std: future поддерживают перемещение, а также могут использоваться для построения std::shared_future и поскольку std::shared_future могут копироваться, объект фьючерса, ссылающийся на совместно используемое состояние, возникающее из вызова std::async, в который была передана f, вероятно, будет отличаться от фьючерса, возвращенного std::async. Однако обычно просто говорят о вызове функций-членов get или wait фьючерса, возвращенного из std::async.

23

Часто их переводят как объединяемое и необъединяемое, но, на наш взгляд, термин подключение лучше отражает смысл происходящего с потоком, связанным с объектом std::thread, при вызове функции join, как и отключение для происходящего при вызове функции detach. — Примеч. пер.

24

Вы можете обратиться к книге Энтони Вильямса (Anthony Williams) С++ Concurrency in Action (Manning Publications, 2012), раздел 9.2.

25

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