Александреску Андрей
Шрифт:
Обычно редко требуется обеспечить наличие пользовательских операторов
Появление данной рекомендации связано с одной тонкой проблемой: дело в том, что компилятор может вызвать перегруженный оператор
Пусть вы определили класс с пользовательским выделением памяти:
Вы вводите простой протокол для выделения и освобождения памяти.
• Вызывающий код может выделять объекты типа
• Единственный оператор
Пока все в порядке.
Однако компилятор может скрыто вызвать другую перегрузку оператора
на самом деле разворачивается в нечто наподобие
Итак, компилятор автоматически вставляет код вызова соответствующего оператора
Теперь перейдем к самому интересному. Стандарт С++ ([C++03] §5.3.4(17)) гласит, что приведенный выше код будет генерироваться тогда и только тогда, когда реально существует соответствующая перегрузка оператора
Размещающий оператор
не требует наличия соответствующего оператора
[C++03] §5.3.4 • [Stroustrup00] §6.2.6.2, §15.6 • [Sutter00] §36