Страустрап Бьярн
Шрифт:
Преобразования с помощью конструктора (§R.12.1) и с помощью функции преобразования (§R.12.3.2) равноправны.
R.13.3 Адрес перегруженной функции
Когда функция с некоторым именем используется без параметров, среди всех функций с таким именем в текущей области видимости выбирается единственная, которая точно соответствует назначению. Назначением может быть:
• инициализируемый объект (§R.8.4);
• левая часть операции присваивания (§R.5.17);
• формальный параметр функции (§R.5.2.2);
• формальный параметр пользовательской операции (§R.13.4);
• тип значения, возвращаемого функцией (§R.8.2.5).
Отметим, что если f и g являются перегруженными функциями, то для правильной интерпретации f(&g) или эквивалентного выражения f(g) нужно рассмотреть пересечение множеств выбора для f и g. Приведем пример:
Последняя инициализация ошибочна, не из-за неоднозначности, а потому, что не определено ни одной функции f типа int(…).
Отметим, что не существует никакого стандартного преобразования (§R.4) указателя на функцию одного типа в указатель на функцию другого типа (§R.4.6). В частности, даже если B является общим базовым классом D, две следующие инициализации недопустимы:
R.13.4 Перегруженные операции
Перегружать можно большинство операций.
Две последние операции - это вызов функции (§R.5.2.2) и индексация (§R.5.2.1).
Можно перегружать следующие (как бинарные, так и унарные) операции:
Нельзя перегружать следующие операции:
а также и специальные символы препроцессора # и ## (§R.16).
Обычно функции, задающие операции (функция-оператор) не вызываются явно, к ним обращаются для выполнения операций (§R.13.4.1, §R.13.4.2).
Однако, к ним можно обращаться явно, например:
Операции new и delete описаны в §R.5.3.3 и §R.5.3.4 и к ним не относятся перечисляемые ниже правила.
Функция-оператор может быть функцией-членом или иметь по крайней мере один параметр типа класс или ссылка на класс. Нельзя изменить приоритет, порядок выполнения или число операндов операции, но можно изменить предопределенное назначение таких операций: =, унарная & и ,(запятой), если они применяются к объекту типа класс. За исключением функции operator=, функция-оператор наследуется. Правила для operator= даны в §R.12.8.
Эквивалентность некоторых операций над основными типами (например, ++a эквивалентно a+=1) может не сохраняться для таких же операций над классами. Для некоторых операций требуется, чтобы в случае использования основных типов операнд был адресом (например, для +=). Это требование может быть снято, если операция задана над классами.
Перегруженная операция не может иметь стандартные значения параметров (§R.8.2.6).
Операции, которые явно не указаны в §R.13.4.3-§R.13.4.7, действуют как обычные унарные или бинарные операции, подчиняющиеся правилам, приведенным в §R.13.4.1 или §R.13.4.2.