Как работает перегрузка оператора (особенно «новая») арность? - PullRequest
2 голосов
/ 13 февраля 2010

Я никогда не понимал, как списки аргументов для перегрузки операторов определяются систематически, и меня особенно смущает проблема, с которой я столкнулся сейчас.

Когда вы перегружаете унарный оператор, он имеет один аргумент или ноль, если это член класса. Когда вы перегружаете бинарный оператор, он имеет два аргумента или один, если это член класса. По крайней мере, так оно и есть. У меня проблема с operator new (не учащимся).

В кодовой базе, в которой я работаю, как и в других местах, которые я видел в прошлом (например, здесь ), есть определение типа #define new new(__FILE__, __LINE__) и соответствующая функция с сигнатурой void *new(size_t size, const char *file, unsigned line) или что-то подобное для отладки памяти. Отмечу, что тот, что в моем проекте, на самом деле отличается от ранее связанного. Это представляет проблему для меня, потому что по некоторым причинам это портит новое размещение. Я заглянул в Язык программирования C ++ , и если это объясняет это, я упускаю его.

Является ли new особенным в этом отношении, т. Е. Имеет ли определенный язык дополнительные отладочные сигнатуры? Это не похоже на то, потому что, как я отметил выше, я видел немного разные подписи в разных местах. Если это так, какие другие операторы имеют неочевидные подписи и каковы они? Являются ли эти различные сигнатуры какими-то специфическими для реализации дополнениями? Если да, то есть ли общие правила относительно того, что делает большинство реализаций? Или же это проблема арности, как я подразумевал в своем названии? Можете ли вы просто добавить в подпись столько дополнительных аргументов, сколько захотите, и если вы вызовете new с аргументами между самим ключевым словом new и новым типом, который вы хотите, вы можете просто сделать что угодно? Или я еще больше сбит с толку, а мне чего-то не хватает?

Самое главное в краткосрочной перспективе (хотя я бы очень хотел это понять), что происходит с моими проблемами new? Макрос вызывает расширение что-то вроде new ("file.cpp", 100) (class_pointer) class_t. Может быть, проблема в двух группах в скобках или что-то еще?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2010

Оператор new ближе к функциям в том смысле, что вы можете обеспечить столько перегрузок, сколько захотите, и компилятор выберет версию на основе правил перегрузки функций.

Итак, когда вы выполните new ((T1)value1, (T2)value2) TYPE, это будет перенаправлено на:

operator new(size_t, T1, T2);

Проблема с вашим макросом заключается в том, что он предполагает, что вы вызываете простую версию new, и что он может использовать препроцессор, чтобы превратить это в вызов отладки new. Макрос не работает, когда вам нужно вызвать другую версию новой.

Если вам нужно назвать размещение новым (или любым другим новым), вы можете исправить эту проблему, отключив этот макрос:

#undef new
0 голосов
/ 13 февраля 2010

Арность перегруженного оператора - это то, что вы объявляете. Для операторов, названных в честь символов (+), если вы определите их как дополнительные аргументы, они будут вызываться только через явный вызов. (оператор + (a, b, c, d, e)). Для оператора new вы должны указать как минимум один аргумент, но можете указать столько, сколько захотите. Обычная перегрузка оператора определяет, какой из них вызывается.

...