• Можно присваивать объекту типа перечисления значение типа int.
• При удалении массива, тип которого не имеет деструктора, можно указывать число элементов; §R.5.3.4.
• Одна функция operator++() может использоваться для перегрузки как префиксных, так и постфиксных операций ++; тоже верно для операции --; §R.13.4.6.
R.18.3.1 Определения функций старого стиля
Можно использовать синтаксис С для определений функций:
>старое-определение-функции:
> спецификации-описаний >opt старый-описатель-функции
> список-описаний >opt тело-функции
>старый-описатель-функции:
> описатель ( список-параметров >opt )
>список-параметров:
> идентификатор
> список-параметров , идентификатор
Приведем пример:
>max(a,b) int b; { return (a‹b) ? b : a; }
Если определенная таким образом функция не была описана ранее, то тип ее формальных параметров полагается (…), т.е. он не будет проверяться.
Если она была описана, то тип должен согласовываться с типом, указанным в описании.
Приведенный синтаксис нельзя использовать для определения функций-членов.
R.18.3.2 Старый стиль задания инициализатора базового класса
В конструкции инициализатор-памяти (§R.12.6.2) можно не указывать имя-класса, обозначающее базовый класс при условии, что существует только один прямой (непосредственный) базовый класс. Поэтому в описании
>class B {
> //…
>public:
> B(int);
>};
>class D: public B {
> //…
> D(int i): (i) {/*… */}
>};
будет вызываться конструктор B с параметром i.
R.18.3.3 Присваивание указателю this
Присваивая определенные значения указателю this, пользователь мог управлять выделением памяти для объекта некоторого класса. В конструкторе до использования членов класса можно было с помощью такого присваивания реализовать свой алгоритм выделения памяти. Присваивая в деструкторе указателю this нуль, можно было обойти стандартную операцию освобождения объектов класса. Кроме того, присваивание нуля в деструкторе отменяло неявные вызовы деструкторов для членов и базовых классов, например:
>class Z {
> int z[10];
> Z() { this = my_allocator(sizeof(Z)); }
> ~Z() { my_deallocator(this); this = 0; }
>};
Если выделение памяти уже произошло (как бывает для членов и объектов auto или static), то при входе в конструктор this имеет ненулевое значение и значение нуль в противном случае.
Вызовы конструкторов для членов и базовых классов произойдут только после того, как this получил значение. Если в конструкторе базового класса есть присваивание this, то новое значение this будет использоваться и в конструкторах производных классов, если они есть.
Отметим, что при наличии указанного анахронизма или тип указателя this не может быть *const, или нужно делать исключение для this из правила о присваивании указателям со спецификацией const.
R.18.3.4 Приведение указателей на функцию-член
Указатель на функцию-член некоторого объекта можно привести к указателю на какую-то другую функцию, например (int (*) ())p-›f. Результирующий указатель будет настроен на функцию, вызов которой будет происходить с помощью обращения к этой функции-члену для того же объекта. Как обычно результат такого вызова считается неопределенным.
R.18.3.5 Невложенность классов
Если класс описан внутри другого класса и в программе больше не описано классов с этим именем, то его можно использовать, как если бы он был описан вне класса (так обстоит дело с описанием struct в С), например:
>struct S {
> struct T {
> int a;
> };
> int b;
>};
>struct T x; // означает `S::T x;'