В обзоре рассмотрены основные отличия новой версии (HIC++ 4.0) от старой (HIC++ 3.3).
Стандарт High Integrity C++ (HIC++) появился в 2003 г. Он объединил все имеющиеся на тот момент практические рекомендации и внутренние ноу-хау в области программирования. Результатом работы стали 202 правила и рекомендаций по применению языка С++.
Последняя, четвертая, версия стандарта значительно переработана. Часть исходных правил переформулирована, неактуальные исключены. Добавлено 61 правило.
Стилистические вопросы сознательно не затронуты и оставлены на опредленение индивидуальными организациями. Всего получилось 155 вместо 202 в версии 3.3.
Сравнение версий 3.3 и 4.0 языка HIC++ приведено на рисунке 1.
Рис. 1. Сравнение версий 3.3 и 4.0 HIC++
Исключенные правила
Когда правил слишком много, могут произойти наложения. Исходя из этого в версии 4.0 исключены 80 правил, касающихся поддержания, переносимости, читаемости и надежности кода.
Например, исключена рекомендация не использовать ключевое слово inline для компонентных функций (member function), а определять их в теле класса. Это очень субъективная рекомендация, не подтвержденная, но и не опровергнутая на практике.
Потеряли актуальность и такие требования, как 3.3.7:
определять виртуальные функции в базовом классе, если поведение будет всегда «по умолчанию» для производных классов.
Некоторые правила стали излишними, и их соблюдение может привести к ошибке компиляции. Например 10.18:
выполнять операции по модулю, чтобы гаранттировать, что оба аргумента неотрицательны.
Два десятка правил оставлены без изменений, 28 переформулирвоаны, остальные претерпели более коренные изменения: 12 ослаблены, 12 расширены, 15 обновлены, 44 объединены в 16.
Новые правила
В последней версии стандарта (C++ 2011) был введен новый синтаксис для упрощения определения специальных компонентных функций, а именно =delete и =default, поэтому все объявления копирующих конструкторов, операторов копирования и дестракторов стали неактуальными (правило 3.1.3 и рекомендация 3.1.13).
Примеры новых правил:
9.2 (версия 3.3) Использовать только объекты классового типа.
15.1.1 (версия 4.0) Для исключений использовать только выражения std::exception.
11.3 (версия 3.3) Указывать имя каждой функции и каждого параметра фукнции при объявлении функции и при определении функции (т.е. дважды). Использовать одинаковые имена при объявлении и определении функции.
8.2.1 (версия 4.0) Не использовать имена параметров при объявлении функций.