Скотт Мейерс - Эффективный и современный С++. 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», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

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

Интервал:

Закладка:

Сделать

public: // собой typedef для std::basic_string

string(const string& rhs); // Копирующий конструктор

string(string&& rhs); // Перемещающий конструктор

};

В списке инициализации членов конструктора Annotationрезультатом std::move(text)является rvalue типа const std::string. Это rvalue нельзя передать перемещающему конструктору std::string, поскольку перемещающий конструктор получает rvalue-ссылку на неконстантную std::string. Однако это rvalue может быть передано копирующему конструктору, поскольку lvalue-ссылку на constразрешено связывать с константным rvalue. Таким образом, инициализация члена использует копирующий конструктор std::string, несмотря на то что textбыл приведен к rvalue! Такое поведение имеет важное значение для поддержания корректности const. Перемещение значения из объекта в общем случае модифицирует этот объект, так что язык программирования должен не разрешать передавать константные объекты в функции (такие, как перемещающие конструкторы), которые могут их модифицировать.

Из этого примера следует извлечь два урока. Во-первых, не объявляйте объекты как константные, если хотите иметь возможность выполнять перемещение из них. Запрос перемещения к константным объектам молча трансформируется в копирующие операции. Во-вторых, std::moveне только ничего не перемещает самостоятельно, но даже не гарантирует, что приведенный этой функцией объект будет иметь право быть перемещенным. Единственное, что точно известно о результате применения std::moveк объекту, — это то, что он является rvalue.

История с std::forwardподобна истории с std::move, но тогда как std::move выполняет безоговорочное приведение своего аргумента в rvalue, std::forwardделает это только при определенных условиях. std::forwardявляется условным приведением. Чтобы понять, когда приведение выполняется, а когда нет, вспомним, как обычно используется std::forward. Наиболее распространенным сценарием является тот, когда шаблон функции получает параметр, представляющий собой универсальную ссылку, и который передается другой функции:

void process(const Widget& lvalArg); // Обработка lvalue

void process(Widget&& rvalArg); // Обработка rvalue

template // шаблон, передающий

void logAndProcess( T&& param) // param на обработку

{

auto now = // Получает текущее время

std::chrono::system_clock::now();

makeLogEntry("Bызoв 'process'", now);

process( std::forward(param));

}

Рассмотрим два вызова logAndProcess, один с lvalue, а другой — с rvalue:

Widget w;

logAndProcess(w); // Вызов с lvalue

logAndProcess(std::move(w)); // Вызов с rvalue

В функции logAndProcessпараметр paramпередается функции process. Функция processперегружена для lvalue и rvalue. Вызывая logAndProcessс lvalue, мы, естественно, ожидаем, что lvalue будет передано функции processкак lvalue, а вызывая logAndProcessс rvalue, мы ожидаем, что будет вызвана перегрузка processдля rvalue.

Однако param, как и все параметры функций, является lvalue. Каждый вызов processвнутри logAndProcessбудет, таким образом, вызывать перегрузку processдля lvalue. Для предотвращения такого поведения нам нужен механизм для приведения paramк rvalue тогда и только тогда, когда аргумент, которым инициализируется param — аргумент, переданный logAndProcess, — был rvalue. Именно этим и занимается std::forward. Вот почему std::forwardпредставляет собой условное приведение: эта функция выполняет приведение к rvalue только тогда, когда ее аргумент инициализирован rvalue.

Вы можете удивиться, откуда std::forwardможет знать, был ли ее аргумент инициализирован rvalue? Например, как в приведенном выше коде std::forwardможет сказать, был ли paramинициализирован с помощью lvalue или rvalue? Краткий ответ заключается в том, что эта информация кодируется в параметре Tшаблона logAndProcess. Этот параметр передается std::forward,которая восстанавливает закодированную информацию. Детальное описание того, как работает данный механизм, вы найдете в разделе 5.6.

Учитывая, что и std::move, и std::forwardсводятся к приведению и единственная разница между ними лишь в том, что std::moveвсегда выполняет приведение, в то время как std::forward— только иногда, вы можете спросить, не можем ли мы обойтись без std::moveи просто использовать везде std::forward. С чисто технической точки зрения ответ утвердительный: std::forwardможет сделать все. Необходимости в std::moveнет. Конечно, ни одна из этих функций не является действительно необходимой , потому что мы могли бы просто вручную написать требуемое приведение, но, я надеюсь, мы сойдемся во мнении, что это будет как минимум некрасиво.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x