Современное состояние языка
Приведем беглое описание новых возможностей языка, введенных с момента публикации ARM и
до публикации проекта стандарта в апреле 1995г.
- Ведены новые ключевые слова-синонимы для операций (and, and_eq, bitand, bitor, compl,
not, or, or_eq, xor, xor-equ).
- В языке появился булевский тип данных bool и литералы этого типа true и false.
- Появился механизм пространств имен (namespace), облегчающий совместную реализацию
проектов группами программистов и позволяющий избегать проблем при использовании
нескольких библиотек (ключевые слова namespace и using).
- Новое ключевое слово explicit позволяет запретить нежелательное использование
конструкторов как функций преобразования типов.
- Изменены синтаксис и семантика для изменения прав доступа к членам классов. Новый
механизм позволяет использовать единый синтаксис для использования членов пространств имен и
членов классов. При этом несколько изменились правила выбора наиболее подходящей из набора
совместно используемых функций (на основе использования ключевого слова using).
- Добавлен механизм явного использования rtti (включающий операцию с ключевым словом
typeid и класс type_info стандартной библиотеки).
- Добавлены новые и скорректированы старые способы явного преобразования типов
(static_cast, dynamic_cast, const_cast и reinterpret_cast).
- Добавлена новая операция new[], парная к операции delete[]; для операций new и delete
изменена семантика выражения размещения с целью более безопасной обработки исключительных
ситуаций в конструкторах. Стандартная операция new теперь не может вернуть значение 0 в случае
нехватки памяти или ошибки, а генерирует исключительную ситуацию. Старый вариант,
возвращающий 0, доступен программисту только c явным указанием.
- Объявления переменных теперь возможны не только в заголовке for-цикла, но и в операторах
if, while, do-while, switch.
- Более точно определено время жизни временных объектов в выражении. Теперь время их
жизни ограниченно полным выражением, а не концом текущего блока, как сказано в ARM.
- Полностью переработано определение шаблонов в Си++. Теперь уже нельзя сказать, что
шаблоны Си++ являются лишь слегка замаскированными синтаксическими подстановками. Для
них обязателен синтаксический разбор и контроль семантики (в максимально возможной степени).
Неоднозначности внутри тел шаблонов, вызываемые неизвестной природой типовых параметров,
явно разрешаются посредством ключевого словом typename.
- Допускаются шаблонные функции-члены нешаблонных классов, вложенные шаблонные
классы и шаблоны - параметры шаблонов.
- Виртуальные функции могут возвращать тип, отличный от типа подменяемой функции
базового класса, если эти типы являются указателями или ссылками на производный и базовый
класс.
- Перечислимый тип (enum) окончательно утвердился как самостоятельный тип, не являющийся
ни одним из целочисленных типов. Теперь разрешено совместное использование функций,
основанное на этом различии; константа 0 перечислимого типа более не считается целочисленным
0, запрещено ее неявное преобразование к указательному типу.
- Ослаблено ограничение на тип, возвращаемый операцией ->. Теперь это может быть
практически произвольный тип.
- Добавлено (на редкость бессмысленное) ключевое слово mutable, позволяющее допускать
изменение членов объекта константного класса.
Более подробно некоторые из этих изменений рассмотрены в статье [6].