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

Здесь есть возможность читать онлайн «Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2016, ISBN: 2016, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Эффективный и современный С++
В книге рассматриваются следующие темы. Освоение С++11 и С++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов
, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и С++14 — т.е. с использованием современного С++.
■ Преимущества и недостатки инициализации с помощью фигурных скобок, спецификации
, прямой передачи и функций
интеллектуальных указателей
■ Связь между
,
, rvalue-ссылками и универсальными ссылками
■ Методы написания понятных, корректных,
лямбда-выражений
■ Чем
отличается от
, как они используются и как соотносятся с API параллельных вычислений С++
■ Какие из лучших методов “старого” программирования на С++ (т.е. С++98) должны быть пересмотрены при работе с современным С++
Более чем 20 лет книги
серии
являются критерием уровня книг по программированию на С++. Понятное пояснение сложного технического материала принесло ему всемирную известность. Он всегда самый желанный гость на международных конференциях, а его услуги консультанта широко востребованы во всем мире.
Скотт Мейерс Эффективный и современный С++, После изучения основ С++ я перешел к изучению того, как применять С++ в промышленном программировании, с помощью серии книг Скотта Мейерса Эффективный С++. Эффективный и современный С++ — наиболее важная из книг серии, предлагающая ключевые рекомендации, стили и идиомы, позволяющие эффективно использовать современный С++. Вы еще не купили эту книгу? Сделайте это прямо сейчас. Герб Саттер,
глава Комитета ISO по стандартизации С++, специалист в области архитектуры программного обеспечения на С++ в Microsoft

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

По умолчанию функция-член operator()в классе замыкания, сгенерированном из лямбда-выражения, является const. Это приводит к тому, что все члены-данные в замыкании в теле лямбда-выражения являются константными. Однако созданная перемещением копия dataвнутри bind-объекта не является константной, так что, чтобы предотвратить модификацию этой копии dataвнутри лямбда-выражения, параметр лямбда-выражения объявляется как указатель на const. Если лямбда-выражение было объявлено как mutable, operator()в его классе замыкания не будет объявлен как const, так что целесообразно опустить constв объявлении параметра лямбда-выражения:

auto func =

std::bind( // Эмуляция в C++11

[]( std::vector&data) mutable// инициализирующего

{ /* uses of data */ }, // захвата для лямбда-

std::move(data) // выражения, объяв-

); // ленного mutable

Поскольку bind-объект хранит копии всех аргументов, переданных std::bind, bind-объект в нашем примере содержит копию замыкания, произведенного из лямбда-выражения, являющегося первым аргументом этого объекта. Следовательно, время жизни замыкания совпадает со временем жизни bind-объекта. Это важно, поскольку это означает, что, пока существует замыкание, существует и bind-объект, содержащий объект, захваченный псевдоперемещением.

Если вы впервые столкнулись с std::bind, вам может понадобиться учебник или справочник по C++11, чтобы все детали этого обсуждения встали на свои места в вашей голове. Вот основные моменты, которые должны быть понятными.

• Невозможно выполнить перемещение объекта в замыкание С++11, но можно выполнить перемещение объекта в bind-объект С++11.

• Эмуляция захвата перемещением в С++11 состоит в перемещении объекта в bind-объект с последующей передачей перемещенного объекта в лямбда-выражение по ссылке.

• Поскольку время жизни bind-объекта совпадает с таковым для замыкания, можно рассматривать объекты в bind-объекте так, как будто они находятся в замыкании.

В качестве второго примера применения std::bindдля эмуляции перемещающего захвата рассмотрим пример кода С++ 14, который мы видели ранее и который создает std::unique_ptrв замыкании:

auto func = [ pw = std::make_unique()] // Как и ранее,

{ return pw->isValidated() // создает pw

&& pw->isArchived(); }; // в замыкании

А вот как выглядит его эмуляция на С++11:

auto func = std::bind(

[]( const std::unique_ptr& pw)

{ return pw->isValidated()

&& pw->isArchived(); },

std::make_unique()

);

Забавно, что я показываю, как использовать std::bindдля обхода ограничений лямбда-выражений в С++11, поскольку в разделе 6.4 я выступаю как сторонник применения лямбда-выражений вместо std::bind. Однако в данном разделе поясняется, что в С++11 имеются ситуации, когда может пригодиться std::bind, и это одна из них. (В С++14 такие возможности, как инициализирующий захват и параметры auto, устраняют такие ситуации.)

Следует запомнить

• Для перемещения объектов в замыкания используется инициализирующий захват С++14.

• В С++11 инициализирующий захват эмулируется с помощью написания классов вручную или применения std::bind.

6.3. Используйте параметры decltypeдля auto&&для передачи с помощью std::forward

Одной из самых интересных возможностей С++14 являются обобщенные лямбда-выражения — лямбда-выражения, в спецификации параметров которых используется ключевое слово auto. Реализация этой возможности проста: operator()в классе замыкания лямбда-выражения является шаблоном. Например, для лямбда-выражения

auto f = []( autox){ return normalize(x); };

оператор вызова функции класса замыкания имеет следующий вид:

class SomeCompilerGeneratedClassName {

public:

template // См. возвращаемый тип auto

auto operator()( Tх) const // в разделе 1.3

{ return normalize(x); }

… // Прочая функциональность

}; // класса замыкания

В этом примере единственное, что делает лямбда-выражение с параметром x, — это передает его функции normalize. Если normalizeрассматривает значения lvalue не так, как значения rvalue, это лямбда-выражение написано некорректно, поскольку оно всегда передает функции normalizelvalue (параметр x), даже если переданный в лямбда-выражение аргумент представляет собой rvalue.

Корректным способом написания лямбда-выражения является прямая передача xв normalize. Это требует внесения в код двух изменений. Во-первых, xдолжен быть универсальной ссылкой (см. раздел 5.2), а во-вторых, он должен передаваться в normalizeс использованием std::forward(см. раздел 5.3). Концептуально это требует тривиальных изменений:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x