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

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

Интервал:

Закладка:

Сделать

auto f = [](auto &&x)

{ return normalize( std::forward (x )); };

Однако между концепцией и реализацией стоит вопрос о том, какой тип передавать в std::forward, т.e. вопрос определения того, что должно находиться там, где я написал “ ???”.

Обычно, применяя прямую передачу, вы находитесь в шаблонной функции, принимающей параметр типа T, так что вам надо просто написать std::forward. В обобщенном лямбда-выражении такой параметр типа Tвам недоступен. Имеется Tв шаблонизированном операторе operator()в классе замыкания, сгенерированном лямбда-выражением, но сослаться на него из лямбда-выражения невозможно, так что это никак не помогает.

В разделе 5.6. поясняется, что если lvalue-apryмeнт передается параметру, являющемуся универсальной ссылкой, то типом этого параметра становится lvalue-ссылка. Если же передается rvalue, параметр становится rvalue-ссылкой. Это означает, что вне лямбда-выражения мы можем определить, является ли переданный аргумент lvalue или rvalue, рассматривая тип параметра x. Ключевое слово decltypeдает нам возможность сделать это (см. раздел 1.3). Если было передано lvalue, decltype(x)даст тип, являющийся lvalue-ссылкой. Если же было передано rvalue, decltype(x)даст тип, являющийся rvalue-ссылкой.

В разделе 5.6 поясняется также, что при вызове std::forwardсоглашения требуют, чтобы для указания lvalue аргументом типа была lvalue-ссылка, а для указания rvalue — тип, не являющийся ссылкой. В нашем лямбда-выражении, если x привязан к lvalue, decltype(x)даст lvalue-ссылку. Это отвечает соглашению. Однако, если xпривязан к rvalue, decltype(x)вместо типа, не являющегося ссылкой, даст rvalue-ссылку. Но взглянем на пример реализации std::forwardв С++14 из раздела 5.6:

template // В пространстве

T&& forward(remove_reference_t& param) // имен std

{

return static_cast(param);

}

Если клиентский код хочет выполнить прямую передачу rvalue типа Widget, он обычно инстанцирует std::forwardтипом Widget(т.e. типом, не являющимся ссылочным), и шаблон std::forwardдает следующую функцию:

Widget&& forward( Widget& param) // Инстанцирование для

{ // std::forward, когда

return static_cast< Widget&&>(param); // T является Widget

}

Но рассмотрим, что произойдет, если код клиента намерен выполнить прямую передачу того же самого rvalue типа Widget, но вместо следования соглашению об определении Tкак не ссылочного типа определит его как rvalue-ссылку, т.e. рассмотрим, что случится, если Tопределен как Widget&&. После начального инстанцирования std::forwardи применения std::remove_reference_t, но до свертывания ссылок (еще раз обратитесь к разделу 5.6) std::forwardбудет выглядеть следующим образом:

Widget&&&& forward( Widget&param) // Инстанцирование

{ // std::forward при

return static_cast< Widget&&&&>(param); // T, равном Widget&&

} // (до сворачивания ссылок)

Применение правила сворачивания ссылок о том, что rvalue-ссылка на rvalue-ссылку становится одинарной rvalue-ссылкой, приводит к следующему инстанцированию:

Widget&& forward(Widget& param) // Инстанцирование

{ // std::forward при

return static_cast(param); // T, равном Widget&&

} // (после сворачивания ссылок)

Если вы сравните это инстанцирование с инстанцированием, получающимся в результате вызова std::forwardс T, равным Widget, то вы увидите, что они идентичны. Это означает, что инстанцирование std::forwardтипом, представляющим собой rvalue-ссылку, дает тот же результат, что и инстанцирование типом, не являющимся ссылочным.

Это чудесная новость, так как decltype(x)дает rvalue-ссылку, когда в качестве аргумента для параметра x нашего лямбда-выражения передается rvalue. Выше мы установили, что, когда в наше лямбда-выражение передается lvalue, decltype(х)дает соответствующий соглашению тип для передачи в std::forward, и теперь мы понимаем, что для rvalue decltype(x)дает тип для передачи std::forward, который не соответствует соглашению, но тем не менее приводит к тому же результату, что и тип, соответствующий соглашению. Так что как для lvalue, так и для rvalue передача decltype(x) в std::forwardдает нам желаемый результат. Следовательно, наше лямбда-выражение с прямой передачей может быть записано следующим образом:

auto f = [](auto&& x)

{ return normalize(std::forward< decltype(x)>(x)); };

Чтобы это лямбда-выражение принимало любое количество параметров, нам, по сути, надо только шесть точек, поскольку лямбда-выражения в С++14 могут быть с переменным числом аргументов:

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

Интервал:

Закладка:

Сделать

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

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


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

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

x