Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Список вопросов






Цель

Цель этого C++11 FAQ:

· Дать обзор новых возможностей (возможностей языка и стандартных библиотек), предлагаемых языком С++11 по сравнению с предыдущими версиями стандарта языка C++.

· Дать представление о целях работы комитета по стандартизации языка С++.

· Показать новые возможности языка с точки зрения программиста.

· Дать ссылки для более глубокого изучения новых возможностей.

· Назвать имена многих людей, кто оказал неоценимый вклад (в основном авторов докладов, написанных для комитета). Стандарт разработан не безликой организацией.

Обращаю внимание, что целью данного FAQ не является полноценное описание конкретных возможности языка или детальное объяснениеКакова была цель создания С++11? их использования. Цель этого документа – показать простые примеры, демонстрирующие возможности языка С++11 (и дать дополнительные ссылки). Идеальный вариант – «максимум одна страница для описания одной возможности» не зависимо от ее сложности. Подробности всегда могут быть найдены в дополнительных ссылках.

Список вопросов

Вот некоторые высокоуровневые вопросы:

· А что вы думаете о С++11?

· Когда будет принят официальный стандарт С++0x?

· Когда компиляторы реализуют поддержку С++11?

· Когда будут доступны новые стандартные библиотеки?

· Какие новые языковые возможности появились в С++11?

· Какие новые языковые возможности появились в С++11?

· Что нового в стандартной библиотеке С++11?

· Какими конкретными целями руководствовался комитет по стандартизации?

· Как мне найти документы комитета по стандартизации?

· А где я могу найти научные и технические статьи о C++11?

· Где еще я могу почитать о С++11?

· А есть ли видео материалы о C++11?

· Сложно ли учить С++11?

· Как работает комитет по стандартизации?

· Кто является членом комитета?

· Будет ли С++1y?

· Что случилось с «концептами»?

· Есть ли возможности языка, которые вам не нравятся?

Вопросы об отдельных возможностях языка:

· __cplusplus

· Auto – вывод типа из инициализатора

· Range-for оператор

· Правые угловые скобки

· Управление поведением по умолчанию: default и delete

· Управление поведением по умолчанию: копирование и перемещение

· enum class – строготипизированные перечисления с дополнительной областью видимости

· сonstexpr – обобщенные гарантировано константные выражения

· decltype – тип выражения

· Списки инициализации

· Предотвращение сужения (narrowing) типов

· Делегирующие конструкторы

· Инициализация членов класса при объявлении

· Унаследованные конструкторы

· Статические утверждения (утверждения времени компиляции) – static_assert

· long long -- более длинное целое

· nullptr -- литерал для задания нулевого указателя

· template alias (известные ранее как “template typedef”)

· Variadic Templates

· Унифицированый синтаксис и семантика инициализации

· Rvalue ссылки

· Объединения

· POD типы

· Сырые строковые литералы

· Пользовательские литералы

· Атрибуты

· Лямбда-выражения

· Локальные типы в шаблонных аргументах

· noexcept – предотвращение проброса исключений

· Выравнивание (alignment)

· Управление переопределением функций: override

· Управление переопределением функций: final

· Возможности С99

· Расширенные целочисленные типы

· Динамическая инициализация и разрушение в многопоточной среде

· thread-local storage (thread_local)

· Юникодные символы

· Копирование и повторная генерация исключений

· Extern templates

· Inline namespace

· Операторы явного преобразования

· Модель памяти

 

 

Обычно я беру примеры из соответствующих предложений (proposals). Спасибо их авторам. Многие примеры заимствованы из моих собственных работ и выступлений.

Список вопросов об отдельных возможностях стандартной библиотеки:

· Улучшения алгоритмов

· Улучшения контейнеров

· Аллокаторы с дополнительным состоянием

· std:: array

· std:: forward_list

· Неупорядоченные контейнеры

· std:: tuple

· Метапрограммирование и характеристики типов

· std:: function и std:: bind

· unique_ptr

· shared_ptr

· weak_ptr

· Garbage collection ABI

· Потоки

· Взаимное исключение

· Блокировки

· Условные переменные

· Работа со временем

· Атомарные операции

· std:: future и std:: promise

· std:: async()

· Завершение процесса

· Генерация случайных чисел

· Регулярные выражения

 

Ниже находятся ответы на все приведенные выше вопросы.

А что вы думаете о С++11?

Это невероятно часто задаваемый (мне) вопрос. Я даже думаю, что это самый часто задаваемый вопрос. Удивительно, но С++11 воспринимается как абсолютно новый язык: разные возможности языка подогнаны друг к другу так, как никогда ранее, и более высокоуровневый стиль программирования стал более естественным и все таким же эффективным. Если вы относитесь к языку С++, как к лучшему С, или просто как к объектно-ориентированному языку, тогда вы не поняли главного. Новый язык предоставляет более гибкие и доступные абстракции, чем раньше. Вспомните старое правило: если вы думаете о чем-то, как об отдельном объекте или понятии, выразите это в программе; моделируйте объекты реального мира и абстракции непосредственно в коде. Теперь, это сделать намного проще: вы можете выразить свои мысли при помощи перечислений, объектов, классов (например, задавая поведение по умолчанию), иерархий классов (например, с помощью наследуемых конструкторов (inherited constructors), шаблонов, синонимов (aliases), исключений, циклов, потоков и т.д., а не использовать универсальной (“one size fits all”) механизм абстракций.

Моя мечта состоит в том, чтобы возможности языка помогали программистам думать о дизайне и реализации системы по-другому. Мне кажется, что С++11 может помочь в этом, и не только для С++ программистов, но и для тех, кто работает с другими современными языками программирования в такой обширной области как системное программирование.

Короче говоря, я все еще настроен оптимистично:)

Когда будет принят официальный стандарт С++0x?

Он уже принят! Первый черновик для формального утверждения был предоставлен в сентябре 2008 года. Окончательный Международный Черновик стандарта (FCD – Final International Draft) был единогласно одобрен комитетом по стандартизации 25-го марта 2011 года. И он был официально принят единогласным решением в августе 2011-го. Стандарт был опубликован в этом году (2011).

Следуя соглашению, новый стандарт был назван С++11 (поскольку он был опубликован в 2011-м). Лично я использую просто С++ и добавляю год только когда мне нужно различить разные версии языка С++, такие как ARM C++, C++98 и C++03. Во время переходного периода я все еще иногда использую С++0x. И вы можете рассматривать “x”, как признак шестнадцатеричного формата.

Когда компиляторы реализуют поддержку С++11?

Существующие компиляторы (например, GCC C++, Clang C++, IBM C++ и Microsoft C++) уже реализовали многие возможности С++11. Например, многие компиляторы реализуют полностью (или почти полностью) новые возможности стандартной библиотеки.

С выходом новых версий компиляторов я ожидаю появление поддержки все новых и новых возможностей. Я ожидаю увидеть первый компилятор с полной поддержкой возможностей С++11 в 2012-м году, но я не хочу гадать, когда выйдет этот компилятор или когда все компиляторы будут поддерживать все возможности С++11. Хочу заметить, что все возможности С++11 уже были кем-то и когда-то реализованы, так что уже существует определенный опыт, на который могут положиться разработчики компиляторов.

Вот некоторые ссылки о С++11 от производителей компиляторов:

· Сравнение поддержки компиляторами возможностей С++

· GCC

· IBM

· Microsoft

· EDG

· Clang

 

Когда будут доступны новые стандартные библиотеки?

Новые версии стандартных библиотек сейчас поставляются вместе с реализациями от GCC, Clang и Microsoft, а также доступны в boost.

Какие новые языковые возможности появились в С++11?

Нельзя улучшить язык программирования, просто добавив все возможности, которые показались кому-то интересными. На самом деле, мне предлагали включить в язык С++ практически каждую возможность современных языков программирования; представьте себе как бы выглядел коктейль из C99, C#, Java, Haskell, Lisp, Python и Ada. Кроме того, не забывайте о том, что старые возможности удалять нельзя, даже если комитет согласится, что они неудачные: как показывает опыт, пользователи заставляют поставщиков компиляторов поддерживать устаревшие или запрещенные возможности десятками лет с помощью ключей компилятора (либо эти возможности могут быть включены по умолчанию).

В попытке выбрать рациональное звено из потока предложений, мы выработали набор конкретных целей. Мы не могли следовать им в точности и они не были настолько полными, чтобы комитет мог следовать им неукоснительно (да и, IMO, это было невозможно).

В результате мы получили язык со значительно улучшенным механизмом абстракций. Был существенно расширен набор абстракций, которые могут быть выражены на языке С++ элегантно, гибко и с минимумом затрат по сравнению с самописными решениями. Когда мы говорим «абстракция», то люди обычно думают о «классах» и «объектах». С++11 идет значительно дальше: количество пользовательских типов, которые могут быть ясно и безопасно выражены на языке С++, существенно возросло после добавлении списков инициализации, обобщенной инициализации, синонимов шаблонов, rvalue ссылок, удаленных функций и функций по умолчанию (defaulted and deleted functions), а также шаблонов с переменным числом аргументов (variadic templates). Реализация абстракций упрощается с помощью таких возможностей, как auto, наследуемые конструкторы (inherited constructors) и decltype. Этих изменений достаточно, чтобы относиться к С++11, как к новому языку программирования.

Список доступных возможностей языка см. в списке новых возможностей.

Что нового в стандартной библиотеке С++11?

Я бы хотел видеть большее количество стандартных библиотек. Однако уже сейчас определение стандартной библиотеки занимает 70% текста стандарта (и это без учета стандартной библиотеки С, которая включена в стандарт в виде ссылки). И хотя некоторые из нас хотели бы видеть в стандартных библиотеках массу других возможностей, никто не может обвинить рабочую группу стандартной библиотеки в нерасторопности. Стоит также отметить, что библиотеки С++98 были существенно улучшены путем использования новых языковых возможностей, таких как списки инициализации, rvalue ссылки, шаблоны с переменным числом аргументов, ключевого слова noexcept и constexpr. Стандартной библиотекой С++11 проще пользоваться и она работает быстрее, чем стандартная библиотека С++98.

Список доступных библиотек см. в списке библиотечных компонентов.

Какова была цель создания С++11?

С++ является языком программирования общего назначения, с некоторым уклоном в системное программирование. Этот язык:

· улучшенный С

· поддерживает абстракцию данных

· поддерживает объектно-ориентированное программирование

· поддерживает обобщенное программирование

Стандарт С++11 был призван решить следующие задачи:

· Сделать язык С++ более подходящим для системного программирования и разработки библиотек, т.е. внести вклад для всего сообщества пользователей языка С++, а не предоставить набор возможностей для конкретного под-сообщества (например, для численных вычислений или для разработчиков приложений под Windows).

· Сделать язык С++ проще для обучения и изучения путем унификации возможностей, более строгих гарантий и направленности на новичков (новичков всегда будет больше, чем экспертов).

Естественно, что все это сделано с жесткими ограничениями обратной совместимости. И лишь изредка комитету пришлось нарушить работающий код, и то, только при добавлении новых ключевых слов (таких как static_assert, nullptr и constexpr).

Подробнее об этом см. в:

· B. Stroustrup: What is C++0x?. CVu. Vol 21, Issues 4 and 5. 2009.

· B. Stroustrup: Evolving a language in and for the real world: C++ 1991-2006. ACM HOPL-III. June 2007.

· B. Stroustrup: A History of C++: 1979-1991. Proc ACM History of Programming Languages conference (HOPL-2). March 1993.

· B. Stroustrup: C and C++: Siblings. The C/C++ Users Journal. July 2002.

 

Какими конкретными целями руководствовался комитет по стандартизации?

Естественно, что у разных людей и у разных организаций, вовлеченных в процесс стандартизации, были несколько разные цели, особенно, когда дело касалось деталей и приоритетов. Кроме того, с течением времени изменялись и конкретные цели. Помните, что комитет даже не имеет возможности сделать все, что единогласно было признано нужным, поскольку состоит из добровольцев с весьма ограниченными ресурсами. Однако, ниже представлен набор критериев, которыми пользовались при обсуждении того, какие возможности и библиотеки подходят для С++11:

· Поддержка стабильности и обратной совместимости; не ломать старый код, а если без этого не обойтись, то не делать это втихую.

· Отдавать предпочтение библиотекам, перед новыми языковыми возможностями – цель, которую комитет не смог достигнуть полностью; слишком многие члены комитета и сообщества предпочитают «настоящие языковые возможности».

· Отдавать предпочтение обобщению, а не специализации – сосредоточиться на улучшении механизма абстракций (классов, шаблонов и т.д.).

· Поддерживать и новичков, и экспертов; новичкам поможет улучшения библиотек и обобщения правил; экспертам же нужны более общие и эффективные возможности.

· Улучшить безопасность типов в основном за счет возможностей, которые позволяют избегать небезопасных с точки зрения типов возможностей.

· Улучшить производительность и возможность работы с оборудованием на прямую; сделать С++ еще более подходящим инструментом для встроенных (embedded) систем и высокопроизводительных вычислений.

· Соответствовать потребностям реального мира; не забывать об инструментах, стоимости реализации, проблемах миграции, проблемах бинарных интерфейсов (ABI – Application Binary Interface), проблемах обучения и изучения и т.д.

Обратите внимание, что главной и самой сложной задачей является одновременное использование старых и новых возможностей языка. Целое значительно больше простой суммы составляющих.

С другой стороны, комитет также затронул области использования и стилей использования языка:

· Аппаратная модель и многопоточность; обеспечить более строгие гарантии и облегчить использование современного аппаратного обеспечения (например, многоядерные процессоры и слабо упорядоченную модели памяти (weakly coherent memory model)). Например, ABI (Application Binary Interface) потоков, типы future, локальная память потоков и ABI атомарных операций.

· Обобщенное программирование (GP – Generic Programming); GP является одним из самых заметных успехов С++98 и мы хотим улучшить его поддержку, основываясь на полученном опыте. Например, с помощью auto и синонимов шаблонов (template aliases).

· Системное программирование; улучшить поддержку низкоуровневого программирования (например, разработку низкоуровневых встроенных систем) и улучшить производительность. Например, с помощью constexpr, std:: array и обобщенных POD (Plain-Old Data) типов.

· Разработка библиотек; устранить ограничения, неэффективность и нарушения механизма абстракций. Например, с помощью встроенных пространств имен (inline namespace), наследуемых конструкторов и rvalue-ссылок.

 

Как мне найти документы комитета по стандартизации?

Посмотрите раздел с документами на веб-сайте комитета. Там вы наверняка увязните в деталях. Посмотрите на «список вопросов» (issues list) и списки «состояний» (например, State of Evolution (July 2008)). Ключевые группы комитета следующие:

· Core (CWG – Core Working Group) – занимается техническими вопросами языка и формулировками.

· Evolution (EWG – Evolution Working Group) – занимается языковыми возможностями и проблемами интеграции языковых возможностей и библиотек.

· Library (LWG – Library Working Group) – занимается предложениями об изменении библиотек.

Здесь вы можете найти последний черновик стандарта C++11.

А где я могу найти научные и технические статьи о C++11?

  • Saeed Amrollahi: Modern Programming in New Millenium: A Technical Survey on Outstanding features of C++0x. Computer Report (Gozaresh-e Computer), No.199, November 2011 (Mehr and Aban 1390), pages 60-82. (in Persian)
  • Mark Batty et al's: Mathematizing C++ concurrency, POPL 2012. // thorough, precise, and mathematical.
  • Gabriel Dos Reis and Bjarne Stroustrup: General Constant Expressions for System Programming Languages. SAC-2010. The 25th ACM Symposium On Applied Computing.
  • Hans-J. Boehm and Sarita V. Adve: Foundations of the C++ concurrency memory model. ACM PLDI'08.
  • Hans-J. Boehm: Threads Basic. HPL technical report 2009-259 // ``what every programmer should know about memory model issues''
  • Douglas Gregor, Jaakko Jarvi, Jeremy Siek, Bjarne Stroustrup, Gabriel Dos Reis, and Andrew Lumsdaine: Concepts: Linguistic Support for Generic Programming in C++. OOPSLA'06, October 2006. // The concept design and implementation as it stood in 2006; it has improved since, though not sufficiently to save it.
  • Douglas Gregor and Jaakko Jarvi: Variadic templates for C++0x. Journal of Object Technology, 7(2): 31-51, February 2008.
  • Jaakko Jarvi and John Freeman: Lambda functions for C++0x. ACM SAC '08.
  • Jaakko Jarvi, Mat Marcus, and Jacob N. Smith: Programming with C++ Concepts. Science of Computer Programming, 2008. To appear.
  • M. Paterno and W. E. Brown: Improving Standard C++ for the Physics Community. CHEP'04. // Much have been improved since then!
  • Michael Spertus and Hans J. Boehm: The Status of Garbage Collection in C++0X. ACM ISMM'09.
  • Verity Stob: An unthinking programmer's guide to the new C++ -- Raising the standard. The Register. May 2009. (Humor (I hope)).
  • [N1781=05-0041] Bjarne Stroustrup: Rules of thumb for the design of C++0x.
  • Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006. ACM HOPL-III. June 2007. (incl. slides and videos). // Covers the design aims of C++0x, the standards process, and the progress up until 2007.
  • B. Stroustrup: What is C++0x?. CVu. Vol 21, Issues 4 and 5. 2009.
  • Anthony Williams: Simpler Multithreading in C++0x. devx.com.

Этот список, скорее всего неполный и вероятно он станет неактуальным после выхода новых работ. Если вы знаете работу, которая достойна этого списка, но здесь ее нет, пожалуйста, пришлите мне ее. Кроме того, некоторые работы устареют после внесения в стандарт последних изменений. Я постараюсь поддерживать комментарии в актуальном состоянии.

Где еще я могу почитать о С++11?

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

· Раздел с документами на веб-сайте комитета.

· Черновик стандарта С++0x.

· Страница в Википедии, посвященная C++11. Эта страница, видно, активно развивается, хотя, явно не членами комитета.

· Список поддерживаемых возможностей С++11.

 

А есть ли видео материалы о C++11?

(Для всех, кто знает меня лично, данный раздел является доказательством того, что это действительно FAQ, а не набор моих любимых вопросов; я не большой фанат видео материалов на техническую тему; мне кажется, что видео выступления сбивают с толку и благодаря многословному формату увеличиваются шансы появления мелких технических ошибок).

Да:

  • B. Stroustrup, H. Sutter, H-J. Boehm, A. Alexandrescu, S.T.Lavavej, Chandler Carruth, and Andrew Sutter: several talks and panels from theGoing Native 2012 conference.
  • Herb Sutter: Writing modern C++ code: how C++ has evolved over the years. September 2011.
  • Herb Sutter: C++ and Beyond 2011: Herb Sutter - Why C++?. August 2011.
  • Try Google videos.
  • Lawrence Crowl: Lawrence Crowl on C++ Threads. in Sophia Antipolis, June 2008.
  • Bjarne Stroustrup: The design of C++0x at U of Waterloo in 2007.
  • Bjarne Stroustrup: Initialization at Google in 2007.
  • Bjarne Stroustrup: C++0x -- An overview. in Sophia Antipolis, June 2008.
  • Lawrence Crowl: Threads.
  • Roger Orr: C++0x. January 2008.
  • Hans-Jurgen Boehm: Getting C++ Threads Right. December 2007.

 

Сложно ли учить С++11?

Ну, поскольку мы не можем удалить ни одну существенную возможность из языка С++, не поломав огромное количество кода, то С++11 больше, чем С++98. Так что если вы хотите знать каждое правило, то изучить С++11 будет сложнее. Нам остается только две возможности, упрощающие обучение (с точки зрения учеников):

· Обобщение: заменить, скажем, три правила одним обобщенным правилом (например, универсальная инициализация, наследуемые конструкторы и потоки).

· Дать более простые альтернативы: предоставить новые возможности, которые проще использовать, по сравнению с аналогичными старыми возможностями (например, array, auto, range-for оператор и regex).

Очевидно, что стиль обучения типа «снизу вверх» нивелирует все эти преимущества, и сейчас (явно) слишком мало материалов, проповедующие другой подход к обучению. Со временем это должно измениться.

Как работает комитет по стандартизации?

Комитет по стандартизации SC22 WG21 работает по правилам работы подобных комитетов ISO. Весьма забавно, что эти правила не стандартизированы и постоянно изменяются.

Во многих странах есть свои национальные комитеты по стандартизации с действующими группами по языку С++. Эти группы участвуют в митингах, общаются посредствам веба и некоторые из них посылают представителей на заседания комитетов ISO. Канада, Франция, Германия, Швейцария и США представлены практически на каждом заседании. Дания, Нидерланды, Япония, Норвегия, Испания и другие реже присутствуют лично.

Большая часть работы выполняется между заседаниями с помощью веба, и результаты оформляются в виде многочисленных документов на вебсайте WG21.

Встречи комитета проходят два-три раза в год, длительностью в одну неделю. Основная работа этих заседаний проходит в рабочих подгруппах, таких как “Core”, “Library”, “Evolution” и “Concurrency”. В случае необходимости проводятся специальные встречи рабочих групп по определенным срочным темам, таким как «концепты» (concepts) или «модель памяти» (memory model). Голосование проводится на основном заседании. В начале, в рабочих группах проводятся «неофициальные опросы», для определения готовности обсуждения вопроса всем комитетом. Затем, голосует комитет целиком (один член комитета – один голос), и затем, если решение принято, проходит национальное голосование. Мы уделяем большое внимание, чтобы не попасть в ситуацию, когда большинство комитета согласно, а национальные комитеты – нет; продолжение заседаний в такой ситуации приведет к бесконечным спорам. Окончательное голосование национальными комитетами по официальному черновику стандарта было проведено по электронной почте.

Комитет имеет тесные связи с группой стандартизации языка С (SC22 WG14) и POSIX, и менее формальные контакты с другими группами.

Кто является членом комитета?

В состав комитета входит большое число людей (порядка 200), 60 из которых принимают участие в недельных встречах дважды или трижды в год. Кроме того, существуют национальные группы по стандартизации, которые проводят заседания в разных странах. Большая часть членов комитета вносят свой вклад либо путем участия в заседаниях, принимают участие в переписке по электронной почте или путем представления различных документов на рассмотрение комитету. У большинства участников также есть друзья и коллеги, которые им помогают. С самого начала, членами комитета были представители разных стран и на каждом заседании присутствовали представители 5-10 стран. В окончательном голосовании участвовали около 20 представителей национальных комитетов. Так что, стандартизация языка С++ - это весьма глобальное начинание, а не затея небольшой сплоченной команды людей, создающей идеальный язык программирования, для «таких же людей, что и они сами». Стандарт – это лучший компромисс, который устраивает все заинтересованные стороны.

Естественно, что многие (но не все) члены комитета в своей повседневной жизни работают на С++. Членами комитета являются разработчики компиляторов, инструментальных средств, разработчики библиотек и приложений (немногие), исследователи (всего несколько), консультанты, разработчики инструментов автоматического тестирования и многие другие.

Вот лишь короткий список организаций, принимающих участие в процессе стандартизации: Adobe, Apple, Boost, Bloomberg, EDG, Google, HP, IBM, Intel, Microsoft, Red hat, Sun.

Вот короткий список имен, с которыми вы можете быть знакомы по литературе или публикациям в интернете: Dave Abrahams, Matt Austern, Pete Becker, Hans Boehm, Steve Clamage, Lawrence Crowl, Beman Dawes, Francis Glassborow, Doug Gregor, Pablo Halpern, Howard Hinnant, Jaakko Jarvi, John Lakos, Alisdair Meredith, Jens Maurer, Jason Merrill, Sean Parent, P.J. Plauger, Tom Plum, Gabriel Dos Reis, Bjarne Stroustrup, Herb Sutter, David Vandevoorde, Michael Wong. Мои извинения более двумстам текущим и прошлым членам комитета, которых я не упомянул в этом списке. Также обратите внимание на список авторов различных документов: стандарт написан множеством людей, а не безликим комитетом.

Чтобы лучше познакомиться с опытом членов комитета, можете обратиться к списку авторов на странице WG21, однако помните, что многие ключевые участники процесса стандартизации написали не так и много документов.

Будет ли С++1y?

Почти наверняка, даже несмотря на то, что комитет засиделся с С++11. Я часто слышу мнение о том, что для сокращения срока стандартизации, комитет должен начать работать над C++1y сразу же после утверждения С++11. Десятилетний интервал между стандартами – это слишком длительный период времени для текущего темпа развития технологии, поэтому некоторые предлагают трехлетний интервал. Лично я склоняюсь, что пятилетний интервал является более реалистичным. Так что, ждем C++16?

Что случилось с «концептами»?

«Концепты» (concepts) – это была возможность языка, предназначенная для спецификации точных требований к аргументам шаблона. К сожалению, комитет решил, что дальнейшая работа над «концептами» может серьезно затянуть процесс стандартизации, поэтому он проголосовал за удаление этой возможности из рабочего документа. Более подробную информацию о причинах удаления можете посмотреть в моей заметке The C++0x “Remove Concepts” Decision и A DevX interview on concepts and the implementation for C++0x.

Поскольку скорее всего, в том или ином виде «концепты» будут частью новой версии языка С++, я решил не удалять из этого документа соответствующий раздел, но перенес его в конец документа:

· Аксиомы (axioms) (семантические утверждения)

· Концепты (concepts)

· Карты концептов (concepts map)

 

Есть ли возможности языка, которые вам не нравятся?

Да. Также мне не нравятся некоторые возможности из С++98, например, макросы. Тут дело не в том, нравится мне та или иная возможность или нахожу ли я ее полезной или нет. Дело в том, чтобы нашелся кто-то, способный убедить остальных поддержать его идею. Или некая техника настолько укоренилась в сообществе программистов, что требует прямой реализации в языке.

__cplusplus

В С++11 макрос __cplusplus будет возвращать новое значение, большее текущего значения 199711L.

Auto – вывод типа из инициализатора

Рассмотрим следующий пример:

auto x = 7;

В данном случае тип переменной x будет int, потому что именно такой тип имеет ее инициализатор. В общем случае мы можем написать:

auto x = expression;

И тип переменной x будет равен типу значения, полученному в результате вычисления «выражения».

Ключевое слово auto для вывода типа переменной из ее инициализатора, наиболее полезно, когда точный тип выражения не известен, либо сложен в написании. Рассмотрим пример:

template< class T> void printall(const vector< T> & v) { for (auto p = v.begin(); p! =v.end(); ++p) cout < < *p < < " \n"; }

 

В С++98, вам бы пришлось писать:

template< class T> void printall(const vector< T> & v) { for (typename vector< T>:: const_iterator p = v.begin(); p! =v.end(); ++p) cout < < *p < < " \n"; }

 

Написать код без использования ключевого слова auto может быть особенно сложно, когда тип переменной тесно связан с типами аргументов шаблона. Например:

template< class T, class U> void multiply(const vector< T> & vt, const vector< U> & vu) { //... auto tmp = vt[i]*vu[i]; //... }

 

Тип переменной tmp должен зависеть от результата умножения T на U, но человеку может быть очень сложно определить конкретный результирующий тип, хотя, конечно же, компилятор легко справится с этой задачей, после того как будут известны конкретные типы T и U.

Отличительная особенность этой возможности состоит в том, что это была самая первая предложенная и реализованная возможность: у меня была ее реализация еще на Cfront в далеком 1984, но мне пришлось от нее избавиться из-за проблем совместимости с языком С. Эта проблема исчезла после того, как С++98 и С99 решили избавиться от использования int, в качестве неявного типа; т.е. оба языка теперь требуют, чтобы в объявлении каждой переменной или функции использовался явный тип. Старое значение ключевого слова auto (“это локальная переменная”) теперь недопустимо. Некоторые члены комитета просмотрели миллионы строк кода в поисках корректного использования, но большая часть касалась тестов или это явно были баги.

Поскольку эта возможность предназначена, прежде всего для упрощения кодирования, auto никак не влияет на спецификацию стандартной библиотеки.

См. также:

· Черновик С++, раздел 7.1.6.2, 7.1.6.4, 8.3.5 (для типов возвращаемых значений

· [N1984=06-0054] Jaakko Jarvi, Bjarne Stroustrup, and Gabriel Dos Reis: Deducing the type of variable from its initializer expression (revision 4).

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.