C++0x
Материал из Википедии — свободной энциклопедии
C++0x — будущая версия стандарта языка C++, вместо ныне существующего ISO/IEC 14882:2003. Новый стандарт будет включать дополнения в ядре языка и расширение STL, включая большую часть TR1 — кроме, вероятно, библиотеки специальных математических функций. Учитывая, что работа над стандартом ещё не завершена — данная статья, возможно, не будет точно соответствовать конечному варианту стандарта. Самая последняя версия будущего стандарта опубликована на сайте комитета ISO C++.
ISO/IEC JTC1/SC22/WG21 Комитет Стандартизации C++ намеревается опубликовать новый стандарт в 2009 (соответственно стандарт который сейчас называют C++0x будет называться C++09). Чтобы успеть Комитет решил сосредоточиться на предложениях поступивших до 2006 и игнорировать более новые[1].
Языки программирования, такие как C++, проходят эволюционное развитие своих возможностей. Этот процесс неизбежно вызывает проблемы совместимости с уже существующим кодом. Согласно докладу, сделанному Бьёрном Страуструпом (изобретатель языка С++ и член Комитета), новый стандарт будет на 100% совместим с нынешней версией языка С++[2].
Содержание |
[править] Предполагаемые изменения стандарта
Как уже было сказано, изменения коснутся как ядра С++ так и его стандартной библиотеки.
При разработке каждого раздела будущего стандарта, комитет использовал ряд правил:
- Поддержка стабильности языка и обеспечение совместимости с C++98 и, по возможности, с Си;
- Предпочитается введение новых возможностей через стандартную библиотеку, а не через ядро языка;
- Предпочитаются изменения которые улучшают технику программирования;
- Совершенствовать C++ с точки зрения системного и библиотечного дизайна, вместо введения новых возможностей полезных для отдельных приложений;
- Увеличивать типобезопасность для обеспечения безопасной альтернативы для нынешних опасных подходов;
- Увеличивать производительность и возможности работать напрямую с аппаратной частью;
- Обеспечивать решение реальных распостранённых проблем;
- Реализовать принцип «не платить за то, что не используешь»;
- Сделать C++ проще для изучения без удаления возможностей, используемых программистами-экспертами.
Уделяется внимание новичкам, которые всегда будут составлять большую часть программистов. Многие новички не стремятся углублять уровень владения С++ ограничиваясь его использованием при работе над узкими специфичными задачами[1]. Кроме того, учитывая универсальность С++ и обширность его использования (включая как разнообразие приложений, так и стилей программирования), даже профессионалы могут оказаться новичками при использовании новых парадигм программирования.
[править] Расширение ядра С++
Первоочередная задача комитета — развитие ядра языка С++. Дата представления C++0x зависит от успехов в этой части стандарта.
Ядро будет значительно усовершенствовано, будет добавлена поддержка многопоточности, поддержка обобщённого программирования, унификация инициализации и повышение производительности.
Для удобства, возможности ядра и его изменения разделены на три основные части: повышение производительности, повышение удобства и новая функциональность. Отдельные элементы могут относится к нескольким группам, но описываться будут только в одной - наиболее подходящей.
[править] Повышение производительности за счёт ядра языка
Эти компоненты языка введены для уменьшения затрат памяти или увеличения производительности.
[править] Ссылки на временные объекты/Семантика переноса (Rvalue Reference/Move semantics)
В стандарте C++, временные объекты (оригинальный термин «R-values», так как они порождаются с правой стороны выражения) можно передавать в функции, но только как константную ссылку (const &). Следовательно, функция не в состоянии определить временный это объект или нормальный, который тоже передали как const &. Кроме того, объект переданный как const & больше нельзя модифицировать (легально).
В C++0x будет добавлен новый тип ссылки — ссылка на временный объект (R-value reference). Его объявление следующее: typename &&. Оно может быть использовано как неконстантный, легально модифицируемый объект. Данное нововведение позволяет учитывать временные объекты и реализовывать семантику переноса (Move semantics).
Например, std::vector это простая обёртка вокруг Си-массива и переменной хранящей его размер. Если std::vector создаётся как временный объект или возвращается из функции — можно создавая новый объект просто перенести все внутренние данные из ссылки нового типа. Конструктор переноса std::vector через полученную ссылку на временный объект просто копирует указатель массива находящийся в ссылке, которая по окончании устанавливается в пустое состояние.

