Об авторе....12
Введение....16
Терминология и соглашения....17
Замечания и предложения....21
От редакции....21
Ждем ваших отзывов!....22
Глава 1. Вывод типов....24
1.1. Вывод типа шаблона....24
1.2. Вывод типа auto....32
1.3. Знакомство с decltype....37
1.4. Как просмотреть выведенные типы....43
Глава 2. Объявление auto....50
2.1. Предпочитайте auto явному объявлению типа....50
2.2. Если auto выводит нежелательный тип, используйте явно типизированный инициализатор....55
Глава 3. Переход к современному C++....62
3.1. Различие между {} и () при создании объектов....62
3.2. Предпочитайте nullptr значениям 0 и NULL....70
3.3. Предпочитайте объявление псевдонимов применению typedef....74
3.4. Предпочитайте перечисления с областью видимости перечислениям без таковой....79
3.5. Предпочитайте удаленные функции закрытым неопределенным....85
3.6. Объявляйте перекрывающие функции как override....89
3.7. Предпочитайте итераторы const_iterator итераторам iterator....96
3.8. Если функции не генерируют исключений, объявляйте их как noexcept....99
3.9. Используйте, где это возможно, constexpr....106
3.10. Делайте константные функции-члены безопасными в смысле потоков....112
3.11. Генерация специальных функций-членов....117
Глава 4. Интеллектуальные указатели....126
4.1. Используйте std::unique_ptr для управления ресурсами путем исключительного владения....127
4.2. Используйте std::shared_ptr для управления ресурсами путем совместного владения....134
4.3. Используйте std::weak_ptr для std::shared_ptr-подобных указателей, которые могут быть висячими....143
4.4. Предпочитайте использование std::make_unique и std::make_shared непосредственному использованию оператора new....147
4.5. При использовании идиомы указателя на реализацию определяйте специальные функции-члены в файле реализации....156
Глава 5. Rvalue-ссылки, семантика перемещений и прямая передача....166
5.1. Азы std::move и std::forward....167
5.2. Отличие универсальных ссылок от rvalue-ссылок....172
5.3. Используйте std::move для rvalue-ссылок, а std::forward — для универсальных ссылок....177
5.4. Избегайте перегрузок для универсальных ссылок....185
5.5. Знакомство с альтернативами перегрузки для универсальных ссылок....191
Отказ от перегрузки....191
Передача const T&....191
Передача по значению....191
Диспетчеризация дескрипторов....192
Ограничения шаблонов, получающих универсальные ссылки....195
Компромиссы....201
5.6. Свертывание ссылок....203
5.7. Считайте, что перемещающие операции отсутствуют, дороги или не используются....209
5.8. Познакомьтесь с случаями некорректной работы прямой передачи....212
Инициализаторы в фигурных скобках....214
0 и NULL в качестве нулевых указателей....215
Целочисленные члены-данные static const и constexpr без определений....215
Имена перегруженных функций и имена шаблонов....217
Битовые поля....218
Резюме....220
Глава 6. Лямбда-выражения....222
6.1. Избегайте режимов захвата по умолчанию....223
6.2. Используйте инициализирующий захват для перемещения объектов в замыкания....230
6.3. Используйте параметры decltype для auto&& для передачи с помощью std::forward....235
6.4. Предпочитайте лямбда-выражения применению std::bind....238
Глава 7. Параллельные вычисления....246
7.1. Предпочитайте программирование на основе задач программированию на основе потоков....246
7.2. Если важна асинхронность, указывайте std::launch::async....250
7.3. Делайте std::thread неподключаемым на всех путях выполнения....255
7.4. Помните о разном поведении деструкторов дескрипторов потоков....261
7.5. Применяйте фьючерсы void для одноразовых сообщений о событиях....266
7.6. Используйте std::atomic для параллельности, volatile — для особой памяти....273
Глава 8. Тонкости....282
8.1. Рассмотрите передачу по значению для копируемых параметров, которые легко перемещаются и всегда копируются....282
8.2. Рассмотрите применение размещения вместо вставки....292
Предметный указатель....302
В этой книге отражен бесценный опыт ее автора как программиста на C++. Новые возможности этого языка программирования, появившиеся в стандартах C++11 и C++14 — это не просто новые ключевые слова или функции, это появление совершенно новых концепций, так что для их эффективного использования недостаточно просто узнать об их существовании, и программировать на C++11, как на несколько улучшенном и расширенном функционально C++98. Когда происходят такие глобальные изменения в языке программирования, их изучению следует посвятить определенное время, написать сотни, а еще лучше — тысячи строк кода, и столкнуться с массой проблем, кажущихся тем более странными и непонятными, чем большим опытом работы с C++98 вы обладаете. К программированию в полной мере относится фраза Евклида о том, что в геометрии нет царских путей. Но пройти путь изучения и освоения нового языка программирования вам может помочь проводник, показывающий наиболее интересные места и предупреждающий о ямах и ухабах. Таким проводником может послужить книга Скотта Мейерса. С ней вы не заблудитесь и не забредете в дебри, из которых будете долго и трудно выбираться с помощью отладчика. При этом книга не просто научит вас использовать новые возможности языка — она научит использовать их эффективно. Но и это не все — книга не просто учит эффективному применению C++, но еще и рассказывает, почему ту или иную задачу следует решать именно так. Эта книга заставляет вас не просто заучить правила — она заставляет думать. И хотя эта книга в первую очередь предназначена для энтузиастов и профессионалов, она достойна места на полке любого программиста — как профессионала, так и зеленого новичка. Освоение C++11 и C++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов auto, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно — так, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и C++14 — т.е. с использованием современного C++.