Глава 1.
Вывод типов 23
1.1. Вывод типа шаблона 23
1.2. Вывод типа auto 31
1.3. Знакомство с decltype 36
1.4. Как просмотреть выведенные типы 42
Глава 2. Объявление auto 49
2.1. Предпочитайте auto явному объявлению типа 49
2.2. Если auto выводит нежелательный тип, используйте явно типизированный инициализатор 54
Глава 3. Переход к современному C++ 61
3.1. Различие между (} и () при создании объектов 61
3.2. Предпочитайте nullptr значениям 0 и NULL 69
3.3. Предпочитайте объявление псевдонимов применению typedef 73
3.4. Предпочитайте перечисления с областью видимости перечислениям без таковой 78
3.5. Предпочитайте удаленные функции закрытым неопределенным 84
3.6. Объявляйте перекрывающие функции как override 88
3.7. Предпочитайте итераторы const iterator итераторам iterator 95
3.8. Если функции не генерируют исключений, объявляйте их как noexcept 98
3.9. Используйте, где это возможно, constexpr 105
3.10. Делайте константные функции-члены безопасными в смысле потоков 111
3.11. Генерация специальных функций-членов 116
Глава 4. Интеллектуальные указатели 125
4.1. Используйте std: :unique_ptr для управления ресурсами путем исключительного владения 126
4.2. Используйте std: : shared ptr для управления ресурсами путем совместного владения 133
4.3. Используйте std: : weak ptr для std: : shared_ptr-noflo6Hbix указателей, которые могут быть висячими 142
4.4. Предпочитайте использование std: :make_unique и std: :make_shared непосредственному использованию оператора new 146
4.5. При использовании идиомы указателя на реализацию определяйте специальные функции-члены в файле реализации 155
Глава 5. Rvalue-ссылки, семантика перемещений и прямая передача 165
5.1. Азы std: :move и std: : forward 166
5.2. Отличие универсальных ссылок от rvalue-ссылок 171
5.3. Используйте std: :move для rvalue-ссылок, a std: : forward — для универсальных ссылок 176
5.4. Избегайте перегрузок для универсальных ссылок 184
5.5. Знакомство с альтернативами перегрузки для универсальных ссылок 190
Отказ от перегрузки 190
Передача const Т & 190
Передача по значению 190
Диспетчеризация дескрипторов 191
Ограничения шаблонов, получающих универсальные ссылки 194
Компромиссы 200
5.6. Свертывание ссылок 202
5.7. Считайте, что перемещающие операции отсутствуют, дороги или не используются 208
5.8. Познакомьтесь с случаями некорректной работы прямой передачи 211
Инициализаторы в фигурных скобках 213
0 и NULL в качестве нулевых указателей 214
Целочисленные члены-данные static const и constexpr без определений 214
Имена перегруженных функций и имена шаблонов 216
Битовые поля 217
Резюме 219
Глава 6. Лямбда-выражения 221
6.1. Избегайте режимов захвата по умолчанию 222
6.2. Используйте инициализирующий захват для перемещения объектов в замыкания 229
6.3. Используйте параметры decltype для autoii для передачи с помощью std:: forward
6.4. Предпочитайте лямбда-выражения применению std: :bind 234
237
Глава 7. Параллельные вычисления 245
7.1. Предпочитайте программирование на основе задач
программированию на основе потоков 245
7.2. Если важна асинхронность, указывайте std:: launch: :async 249
7.3. Делайте std:: thread не подключаемым на всех путях выполнения 254
7.4. Помните о разном поведении деструкторов дескрипторов потоков 260
7.5. Применяйте фьючерсы void для одноразовых сообщений о событиях 265
7.6. Используйте std:: atomic для параллельности, volat i le — для особой памяти 272
Глава 8. Тонкости 281
8.1. Рассмотрите передачу по значению для копируемых параметров, которые легко перемещаются и всегда копируются 281
8.2. Рассмотрите применение размещения вместо вставки 291
Предметный указатель 301
Добавить комментарий