Об изображении на обложке
На обложке книги Эффективный и современный С++ изображен розовошапочный пестрый голубь ( Ptilinopus regina ). Еще одно имя этого вида голубя — Свенсонов пестрый голубь (Swainson's fruit dove). Он отличается ярким оперением: серые голова и грудь, оранжевый живот, беловатое горло, желто-оранжевый цвет радужки и серо-зеленые ноги.
Голубь распространен в равнинных лесах восточной Австралии, муссонных лесах северной части Австралии, а также на малых Зондских островах и Молуккских островах Индонезии. Рацион голубя состоит из различных фруктов наподобие инжира (который он поедает целиком), пальм и лоз. Еще одним источником пищи голубя является камфорный лавр, большое вечнозеленое дерево. Они питаются парами, небольшими стайками или поодиночке в тропических лесах, обычно утром или поздно вечером. Для питья они используют воду из листьев или росу, но не воду с земли.
Пестрый голубь в Новом Южном Уэльсе считается видом, находящимся под угрозой исчезновения из-за изменения среды обитания — лесозаготовок, очистки и улучшения земель, а также вырубки камфорного лавра без адекватной альтернативы.
Многие из животных, представленных на обложках O'Reilly, находятся под угрозой исчезновения. Все они имеют очень важное значение для нашего мира. Чтобы узнать больше о том, как вы можете помочь им, посетите сайт animals.oreilly.com
.
Изображение для обложки взято из Иллюстрированной истории природы Вуда (Wood), из тома, посвященного птицам.
Я начал исследовать то, что тогда было известно как C++0x (зарождающийся С++11), в 2009 году. Я опубликовал множество вопросов в группе новостей Usenet comp.std.c++
и благодарен членам этого сообщества (в особенности Дэниелу Крюглеру (Daniel Krugler)) за их очень полезные сообщения. В последние годы с вопросами по С++11 и С++14 я обращался к Stack Overflow, и я многим обязан этому сообществу за его помощь в понимании тонкостей современного С++.
В 2010 году я подготовил материалы для учебного курса по С++0x (в конечном итоге опубликованные как Overview of the New С++ , Artima Publishing, 2010). На эти материалы, как и на мои знания, большое влияние оказала техническая проверка, выполненная Стивеном Т. Лававеем (Stephan T. Lavavej), Бернгардом Мерклем (Bernhard Merkle), Стенли Фризеном (Stanley Friesen), Леором Зорманом (Leor Zolman), Хендриком Шобером (Hendrik Schober) и Энтони Вильямсом (Anthony Williams). Без их помощи я не смог бы довести мою книгу до конца. Кстати, ее название было предложено несколькими читателями в ответ на мое сообщение в блоге от 18 февраля 2014 года (“Помогите мне назвать мою книгу”), и Андрей Александреску (Andrei Alexandrescu) (автор книги Modern С++ Design[1] Русский перевод — Александреску Андрей. Современное проектирование на С++ . — М.: Издательский дом “Вильямс”, 2002.
, Addison-Wesley, 2001) был достаточно великодушен, чтобы не счесть это название незаконным вторжением на его территорию.
Я не могу указать источники всей информации в этой книге, но некоторые из них непосредственно повлияли на мою книгу. Применение в разделе 1.4 неопределенного шаблона для получения информации о типе от компилятора было предложено Стивеном T. Лававеем, а Мэтт П. Дзюбински (Matt P. Dziubinski) обратил мое внимание на Boost.TypeIndex. В разделе 2.1 пример unsigned std::vector::size_type
взят из статьи Андрея Карпова (Andrey Karpov) от 28 февраля 2010 года “ In what way can С++0x standard help you eliminate 64-bit errors ”. Пример std::pair
/ std::pair
в том же разделе книги взят из сообщения “ STL11: Magic && Secrets ” Стивена T. Лававея на Going Native 2012 . Раздел 2.2 появился благодаря статье Герба Саттера (Herb Sutter) “ GotW #94 Solution: AAA Style (Almost Always Auto) ” от 12 августа 2013 года, а раздел 3.3 — благодаря сообщению в блоге Мартинго Фернандеса (Martinho Fernandes) от 27 мая 2012 года — “Handling dependent names”. Пример в разделе 3.6 демонстрирует перегрузку квалификаторов ссылок, основанную на ответе Кейси (Casey) на вопрос “ What's а use case for overloading member Junctions on reference qualifiers? ” в сообществе Stack Overflow от 14 января 2014 года. В разделе 3.9 описание расширенной поддержки constexpr
-функций в С++14 включает информацию, которую я получил от Рейна Халберсма (Rein Halbersma). Раздел 3.10 основан на презентации Герба Саттера на конференции С++ and Beyond 2012 под названием “You don't know const
и mutable
”. Совет в разделе 4.1, гласящий, что фабричная функция должна возвращать std::unique_ptr
, основан на статье Герба Саттера “GotW# 90 Solution: Factories” от 13 мая 2013 года. fastLoadWidget
в разделе 4.2 получен из презентации Герба Саттера “ My Favorite С++ 10-Liner ” на конференции Going Native 2013. В моем описании std::unique_ptr
и неполных типов в разделе 4.5 использованы статья Герба Саттера от 27 ноября 2011 года “ GotW #100: Compilation Firewalls ”, а также ответ Говарда Хиннанта (Howard Himant) от 22 мая 2011 года на вопрос в Stack Overflow “ Isstd::unique_ptr
required to know the full definition ofT
? ” Дополнительный пример Matrix
в разделе 5.3 основан на письме Дэвида Абрахамса (David Abrahams). Комментарий Джо Аргонна (Joe Argonne) от 8 декабря 2012 года к материалу из блога “ Another alternative to lambda move capture ” от 30 ноября 2013 года стал источником для описанного в разделе 6.2 подхода к имитации инициализации на основе std::bind
в C++11. Пояснения в разделе 7.3 проблемы с неявным отключением в деструкторе std::thread
взяты из статьи Ганса Бехма (Hans-J. Boehm) “ N2802: А plea to reconsider detach-on-destruction for thread objects ” от 4 декабря 2008 года. Раздел 8.1 появился благодаря обсуждению материала в блоге Дэвида Абрахамса “ Want speed? Pass by value ” от 15 августа 2009 года. Идея о том, что типы, предназначенные только для перемещения, должны рассматриваться отдельно, взята у Мэттью Фьораванте (Matthew Fioravante), в то время как анализ копирования на основе присваивания взят из комментариев Говарда Хиннанта (Howard Hinnant). В разделе 8.2 Стивен T. Лававей и Говард Хиннант помогли мне понять вопросы, связанные с относительной производительностью функций размещения и вставки, а Майкл Винтерберг (Michael Winterberg) привлек мое внимание к тому, как размещение может приводить к утечке ресурсов. (Майкл, в свою очередь, называет своим источником презентацию “ С++ Seasoning ” Шона Парента (Sean Parent) на конференции GoingNative 2013. Майкл также указал, что функции размещения используют непосредственную инициализацию, в то время как функции вставки используют копирующую инициализацию.)
Читать дальше