Это отдельные выпуски.
Относительно const
Из стандарта (если слишком долго, читать только полужирный части):
Нестатические функции-члены
[...] Нестатическая функция-член может быть объявлена как const, volatile или const volatile. Эти cv-квалификаторы
влияет на тип указателя this (9.3.2). Они также влияют на тип функции (8.3.5) функции-члена;
функция-член, объявленная const, является функцией-константой , функция-член, объявленная как volatile, является
функция volatile и функция-член, объявленная как const volatile, является постоянным членом
функция. [...]
Указатель this
[...] В const функции-члене объект, для которого вызывается функция, доступен через const доступ
дорожка; следовательно, функция-член const не должна изменять объект и его нестатические члены-данные. [...]
Спецификаторы класса хранения
[...] Изменяемый спецификатор члена данных класса обнуляет спецификатор const, примененный к содержащему объект класса
и разрешает модификацию изменяемого члена класса, даже если остальная часть объекта является const (7.1.6.1).
Сводка: функция-член, квалифицированная как const
, не может изменять любого члена, который не объявлен mutable
. Причина mutable
состоит в том, что даже если объект const
, такой механизм, как кэширование, может быть реализован; эффективная практика заключается в том, что наблюдаемое поведение объекта не изменяется при вызове функции-члена const.
Относительно throw()
Спецификации исключений [ожидаем. Спецификация]
Объявление функции перечисляет исключения, которые ее функция может прямо или косвенно выдавать, используя
спецификация исключения в качестве суффикса своего объявления.
В частности, это спецификация динамического исключения, а
[...] функция, как говорят, допускает исключение типа E, если ее спецификация динамического исключения содержит тип T для
какой обработчик типа T будет совпадением (15.3) для исключения типа E.
Другими словами, типы в (
и )
являются исключениями, которые может генерировать эта функция. Однако по некоторым причинам .
не принято использовать непустые спецификации динамических исключений
.
Использование throw()
, то есть пустого списка исключений, в пре-C ++ 11 было принято практиковать для аннотирования функций, которые никогда не генерируются. Однако, начиная с C ++ 11, текущего стандарта, вместо него следует использовать noexcept
.
Также, начиная с C ++ 11,
[Примечание: использование спецификаций динамических исключений не рекомендуется (см. Приложение D). —Конечная записка]
, поэтому используйте noexcept
.