изложенного материала.
Эшли Морган Вильяме (Ashley Morgan Williams) готовила отличные обеды у себя
в Lake Oswego Pizzicato. Им (и ей) нет равных.
И более двадцати лет моя жена, Нэнси Л. Урбано (Nancy L. Urbano), как обычно во
время моей работы над новой книгой, терпит мою раздражительность и оказывает мне
всемерную поддержку. В ходе написания книги постоянным напоминанием о том, что за
пределами клавиатуры есть другая жизнь, служила мне наша собака Дарла.
14
Благодарности
Вв еден и е
Если вы - опытный программист на языке программирования С++, как, например,
я, то, наверное, первое, о чем вы подумали в связи с С++ 1 1 , - "Да, да, вот и он - тот же
С++, только немного улучшенный". Но познакомившись с ним поближе, вы, скорее все
го, были удивлены количеством изменений. Объявления auto, циклы for для диапазо
нов, лямбда-выражения и rvаluе-ссылки изменили лицо С++, - и это не говоря о новых
возможностях параллельности. Произошли и идиоматические изменения. О и t ypede f
уступили место nullptr и объявлениям псевдонимов. Перечисления получили области
видимости. Интеллектуальные указатели стали предпочтительнее встроенных; переме
щение объектов обычно предпочтител ьнее их копирования.
Даже без упоминания С++ 14 в С++ 1 1 есть что поизучать.
Что еще более важно, нужно очень многое изучить, чтобы использовать новые воз
можности эффективно. Если вам нужна базовая информация о "современных" возмож
ностях С++, то ее можно найти в избытке. Но если вы ищете руководство о том, как
использовать эти возможности для создания правильного, эффективного, сопровождае
мого и переносимого программного обеспечения, поиск становится более сложным. Вот
здесь вам и пригодится данная книга. Она посвящена не описанию возможностей С++ 1 1
и C++l4, а их эффективному применению.
Информация в книге разбита на отдельные разделы, посвященные тем или иным ре
комендациям. Вы хотите разобраться в разных видах вывода типов? Или хотите узнать,
когда следует (а когда нет) использовать объявление auto? Вас интересует, почему функ
ция-член, объявленная как const, должна быть безопасна с точки зрения потоков, как
реализовать идиому Pimpl с использованием st d: : un i que_pt r, почему следует из
бегать режима захвата по умолчанию в лямбда-выражениях или в чем различие между
st d : : а torniс и volа tilе? Ответы на эти вопросы вы найдете в книге. Более того, эти
ответы не зависят от платформы и соответствуют стандарту. Это книга о переносимом С++.
Разделы книги представляют собой рекомендации, а не жесткие правила, поскольку
рекомендации имеют исключения. Наиболее важной частью каждого раздела является
не предлагаемая в нем рекомендация, а ее обоснование. Прочитав раздел, вы сможете
сами определить, оправдывают ли обстоятельства вашего конкретного проекта отход
от данной рекомендации. Истинная цель книги не в том, чтобы рассказать вам, как надо
поступать или как поступать не надо, а в том, чтобы обеспечить вас более глубоким по
ниманием, как та или иная концепция работает в С++ 1 1 и С++ 1 4.
Терминоnо r ия и соrnашения
Чтобы мы правильно понимали друг друга, важно согласовать используемую терми
нологию, начиная, как ни странно это звучит, с термина "С++". Есть четыре официаль
ные версии С++, и каждая именуется с использованием года принятия соответствующего
стандарта ISO: С++98, С++ОЗ, C++l 1 и С++14. С+ +98 и С++ОЗ отличаются один от друго
го только техническими деталями, так что в этой книге обе версии я называю как С++98.
Говоря о С++ 1 1 , я подразумеваю и С++ 1 1 , и С++ 1 4, поскольку С++ 14 является надмно
жеством С++ 1 1 . Когда я пишу "С++ 1 4': я имею в виду конкретно С++ 14. А если я просто
упоминаю С++, я делаю утверждение, которое относится ко всем версиям языка.
Использованный термин
Подразумеваемая версия
(++
Все
(++98
с++98
и
с++03
(++11
(++11
и
(++14
(++14
(++14
В результате я мог бы сказать, что в С++ придается большое значение эффективности
(справедливо для всех версий), в С++98 отсутствует поддержка параллелизма (справед
ливо только для С++98 и С++ОЗ), С++ 1 1 поддерживает лямбда-выражения (справедливо
для C++l l и С++14) и С++14 предлагает обобщен ный вывод возвращаемого типа функ
ции (справедливо только для С++ 1 4).
Наиболее важной особенностью С++ 1 1 , вероятно, является семантика перемещения,
а основой семантики перемещения является отличие rvа/ие-выражени й от /vа/uе-выра
жений. Поэтому rvalue указывают объекты, которые могут быть перемещены, в то время
как lvalue в общем случае перемещены быть не могут. Концептуально (хотя и не всегда
на практике), rvalue соответствуют временным объектам, возвращаемым из функций,
в то время как lvalue соответствуют объектам, на которые вы можете ссылаться по име
ни, следуя указателю или lvalue-ccылкe.
Полезной эвристикой для выяснения, является ли выражение lvalue, является ответ
на вопрос, можно ли получить его адрес. Если можно, то обычно это lvalue. Если нет, это
обычно rvalue. Приятной
Последние комментарии
25 минут 55 секунд назад
2 часов 15 минут назад
8 часов 1 минута назад
8 часов 6 минут назад
8 часов 10 минут назад
8 часов 10 минут назад