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

Скотт Мейерс

Изображение для обложки взято из Иллюстрированной истории природы Вуда (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, Addison-Wesley, 2001) был достаточно великодушен, чтобы не счесть это название незаконным вторжением на его территорию.

Я не могу указать источники всей информации в этой книге, но некоторые из них непосредственно повлияли на мою книгу. Применение в разделе 1.4 неопределенного шаблона для получения информации о типе от компилятора было предложено Стивеном T. Лававеем, а Мэтт П. Дзюбински (Matt P. Dziubinski) обратил мое внимание на Boost.TypeIndex. В разделе 2.1 пример unsigned std::vector<int>::size_type взят из статьи Андрея Карпова (Andrey Karpov) от 28 февраля 2010 года “In what way can С++0x standard help you eliminate 64-bit errors”. Пример std::pair<std::string, int>/std::pair<const std::string, int> в том же разделе книги взят из сообщения “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 “Is std::unique_ptr<T> required to know the full definition of T?” Дополнительный пример 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. Майкл также указал, что функции размещения используют непосредственную инициализацию, в то время как функции вставки используют копирующую инициализацию.)