html текст
All interests
  • All interests
  • Design
  • Food
  • Gadgets
  • Humor
  • News
  • Photo
  • Travel
  • Video
Click to see the next recommended page
Like it
Don't like
Add to Favorites

понедельник, 21 мая 2012 г.

C++ 11 FAQ от Бьярна Страуструпа

Примечание переводчика

Данный FAQ переводится на русский язык с любезного разрешения его автора - Бьярне Страуструпа. На данный момент работа над оригиналом этого документа еще не закончена, поэтому по мере изменения или дополнения оригинала, будет изменяться и перевод. Все пожелания/замечания по качеству перевода присылайте по почте, либо через профиль Google.

Благодарности: огромное спасибо Володе Тихонюку за вычитку материала и ценные советы!

Последние изменения в оригинале: 23.02.2012

С++11 – принятый недавно новый ISO стандарт языка С++

Этот документ написан и поддерживается Бьярне Страуструпом (Bjarne Stroustrup). Конструктивные комментарии, поправки, ссылки и предложения всецело поддерживаются. Сейчас я работаю над полнотой материала и приведением в порядок ссылок.

C++11 – это стандарт языка С++ утвержденный Международной организацией по стандартизации (ISO) в 2011-м году. Предыдущие версии стандарта обычно называют C++98 или C++03. Различия между С++98 и С++03 настолько специфические и их настолько мало, что на них можно не обращать внимания.

Доступна последняя версия рабочего документа, и она близка к окончательной версии черновика стандарта, формально принятого единогласным решением (21-0) в августе 2011 года.

До официального утверждения, будущий стандарт называли C++0x. К сожалению, у меня пока что не было времени везде обновить имя стандарта, вы уж простите, и вообще, мне очень нравится название C++ 0x :-). Название “C++ 0x” осталось с тех давних пор, когда мы надеялись, что новый стандарт будет называться C++08 или C++09. Сейчас можно рассматривать “x” в имени, как признак шестнадцатеричного формата (т.е. C++0B == C++11).

Все официальные документы, связанные со стандартом C++11/C++0x можно найти на официальном веб-сайте комитета по стандартизации. Официальное имя комитета SC22 WG21.

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


Цель

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

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

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


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

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

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

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

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

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


А что Вы думаете о С++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, 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).

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


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

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

  • Поддержка стабильности и обратной совместимости; не ломать старый код, а если без этого не обойтись, то не делать это втихую.
  • Отдавать предпочтение библиотекам, перед новыми языковыми возможностями – цель, которую комитет не смог достигнуть полностью; слишком многие члены комитета и сообщества предпочитают «настоящие языковые возможности».
  • Отдавать предпочтение обобщению, а не специализации – сосредоточиться на улучшении механизма абстракций (классов, шаблонов и т.д.).
  • Поддерживать и новичков, и экспертов; новичкам поможет улучшения библиотек и обобщения правил; экспертам же нужны более общие и эффективные возможности.
  • Улучшить безопасность типов в основном за счет возможностей, которые позволяют избегать небезопасных с точки зрения типов возможностей.
  • Улучшить производительность и возможность работы с оборудованием на прямую; сделать С++ еще более подходящим инструментом для встроенных (embedded) систем и высокопроизводительных вычислений.
  • Соответствовать потребностям реального мира; не забывать об инструментах, стоимости реализации, проблемах миграции, проблемах бинарных интерфейсов (ABI – Application Binary Interface), проблемах обучения и изучения и т.д.

понедельник, 21 мая 2012 г.

C++ 11 FAQ от Бьярна Страуструпа

Примечание переводчика

Данный FAQ переводится на русский язык с любезного разрешения его автора - Бьярне Страуструпа. На данный момент работа над оригиналом этого документа еще не закончена, поэтому по мере изменения или дополнения оригинала, будет изменяться и перевод. Все пожелания/замечания по качеству перевода присылайте по почте, либо через профиль Google.

Благодарности: огромное спасибо Володе Тихонюку за вычитку материала и ценные советы!

Последние изменения в оригинале: 23.02.2012

С++11 – принятый недавно новый ISO стандарт языка С++

Этот документ написан и поддерживается Бьярне Страуструпом (Bjarne Stroustrup). Конструктивные комментарии, поправки, ссылки и предложения всецело поддерживаются. Сейчас я работаю над полнотой материала и приведением в порядок ссылок.

C++11 – это стандарт языка С++ утвержденный Международной организацией по стандартизации (ISO) в 2011-м году. Предыдущие версии стандарта обычно называют C++98 или C++03. Различия между С++98 и С++03 настолько специфические и их настолько мало, что на них можно не обращать внимания.

Доступна последняя версия рабочего документа, и она близка к окончательной версии черновика стандарта, формально принятого единогласным решением (21-0) в августе 2011 года.

До официального утверждения, будущий стандарт называли C++0x. К сожалению, у меня пока что не было времени везде обновить имя стандарта, вы уж простите, и вообще, мне очень нравится название C++ 0x :-). Название “C++ 0x” осталось с тех давних пор, когда мы надеялись, что новый стандарт будет называться C++08 или C++09. Сейчас можно рассматривать “x” в имени, как признак шестнадцатеричного формата (т.е. C++0B == C++11).

Все официальные документы, связанные со стандартом C++11/C++0x можно найти на официальном веб-сайте комитета по стандартизации. Официальное имя комитета SC22 WG21.

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


Цель

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

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

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


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

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

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

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

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

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


А что Вы думаете о С++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, 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).

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


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

Естественно, что у разных людей и у разных организаций, вовлеченных в процесс стандартизации, были несколько разные цели, особенно, когда дело касалось деталей и приоритетов. Кроме того, с течением времени изменялись и конкретные цели. Помните, что комитет даже не имеет возможности сделать все, что единогласно было признано нужным, поскольку состоит из добровольцев с весьма ограниченными ресурсами. Однако, ниже представлен набор критериев, которыми пользовались при обсуждении того, какие возможности и библиотеки подходят для С++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?

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


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

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


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

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

Да:


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

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

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


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

Комитет по стандартизации 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.

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


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

Да. Также мне не нравятся некоторые возможности из С++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 никак не влияет на спецификацию стандартной библиотеки.

См. также:


Диапазонный for

Диапазонный for позволяет итерировать по «диапазону» (range), что позволяет «пройтись» по любой STL последовательности, заданной методами begin() и end(). Все стандартные контейнеры могут быть использованы в качестве «диапазона», в том числе std::string, список инициализаторов, массив и любой другой класс, для которого вы определите методы begin() и end(), например, istream. Например:

	void f(vector<double>& v)
	{
		for (auto x : v) cout << x << '\n';
		// использование ссылки дает возможность изменять значение
		for (auto& x : v) ++x;
	}

Вы можете прочитать этот код таким образом: «для всех x в v», перебрать все элементы, начиная с v.begin() и заканчивая v.end(). Вот еще один пример:

	for (const auto x : { 1,2,3,5,8,13,21,34 }) cout << x << '\n';

Методы begin() и end() могут быть функциями членами и вызываться в форме x.begin() или свободными функциями, вызываемыми в форме begin(x). При этом приоритет функций-членов выше.

См. также:


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

Давайте рассмотрим следующий код:

	list<vector<string>> lvs;

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

А почему это вообще было проблемой? Компилятор состоит из нескольких этапов анализа. Вот самая простая модель:

  • Лексический анализ (создание лексем из символов).
  • Синтаксический анализ (проверка грамматики).
  • Проверка типов (поиск имен типов и выражений).
Читать дальше
Twitter
Одноклассники
Мой Мир

материал с sergeyteplyakov.blogspot.ru

101
    +83 surfers

      Add

      You can create thematic collections and keep, for instance, all recipes in one place so you will never lose them.

      No images found
      Previous Next 0 / 0
      500
      • Advertisement
      • Animals
      • Architecture
      • Art
      • Auto
      • Aviation
      • Books
      • Cartoons
      • Celebrities
      • Children
      • Culture
      • Design
      • Economics
      • Education
      • Entertainment
      • Fashion
      • Fitness
      • Food
      • Gadgets
      • Games
      • Health
      • History
      • Hobby
      • Humor
      • Interior
      • Moto
      • Movies
      • Music
      • Nature
      • News
      • Photo
      • Pictures
      • Politics
      • Psychology
      • Science
      • Society
      • Sport
      • Technology
      • Travel
      • Video
      • Weapons
      • Web
      • Work
        Submit
        Valid formats are JPG, PNG, GIF.
        Not more than 5 Мb, please.
        30
        surfingbird.ru/site/
        RSS format guidelines
        500
        • Advertisement
        • Animals
        • Architecture
        • Art
        • Auto
        • Aviation
        • Books
        • Cartoons
        • Celebrities
        • Children
        • Culture
        • Design
        • Economics
        • Education
        • Entertainment
        • Fashion
        • Fitness
        • Food
        • Gadgets
        • Games
        • Health
        • History
        • Hobby
        • Humor
        • Interior
        • Moto
        • Movies
        • Music
        • Nature
        • News
        • Photo
        • Pictures
        • Politics
        • Psychology
        • Science
        • Society
        • Sport
        • Technology
        • Travel
        • Video
        • Weapons
        • Web
        • Work

          Submit

          Thank you! Wait for moderation.

          Тебе это не нравится?

          You can block the domain, tag, user or channel, and we'll stop recommend it to you. You can always unblock them in your settings.

          • AndreyKarpov2012
          • домен blogspot.ru
          • домен sergeyteplyakov.blogspot.ru

          Get a link

          Спасибо, твоя жалоба принята.

          Log on to Surfingbird

          Recover
          Sign up

          or

          Welcome to Surfingbird.com!

          You'll find thousands of interesting pages, photos, and videos inside.
          Join!

          • Personal
            recommendations

          • Stash
            interesting and useful stuff

          • Anywhere,
            anytime

          Do we already know you? Login or restore the password.

          Close

          Add to collection

             

            Facebook

            Ваш профиль на рассмотрении, обновите страницу через несколько секунд

            Facebook

            К сожалению, вы не попадаете под условия акции