Имеет ли смысл перегружать унарный оператор &? - PullRequest
4 голосов
/ 16 октября 2010

Итак, C ++ позволяет перегружать унарный operator & (адрес). Вам известен какой-либо реальный пример, когда operator & был по праву перегружен? И второй, более конкретный вопрос, вам известен какой-либо реальный пример, когда operator & был по праву перегружен при сохранении семантики адреса? TIA

Ответы [ 6 ]

5 голосов
/ 16 октября 2010

У меня есть 207 в реальном мире примеры operator &(): Поиск кода 1 , Поиск кода 2 .

Включая SafeInt<> (чтобы получить базовое голое целое число), boost :: gil (по-видимому, также для получения необработанных данных), Mozilla (которые говорят «это рискованно» чтобы определить оператор &, но, эй, мы знаем, что делаем. "), wxWidgets, Armagetron и многое другое.

Кажется, некоторые используют итератор идиома &*it, чтобы получить необработанную ссылку или указатель назад, и пишут *&it, чтобы получить необработанную ссылку, и &it, чтобы получить необработанный указатель.

Обратите внимание, что как только ваш тип перегружает operator& и возвращает что-то отличное от встроенного оператора, ваш тип больше не является CopyConstructible (в C ++ 03 - C ++ 0x, кажется, его поднял), и поэтому не может больше не будет использоваться как тип элемента в стандартном контейнере.

4 голосов
/ 16 октября 2010

По-видимому, используется в ATL, например, http://msdn.microsoft.com/en-us/library/5s6et3yb.aspx

1 голос
/ 16 октября 2010

Я делал это один раз, когда у объекта был умный указатель специального назначения. operator& тихо «поднял» выделенный стеком объект в версию интеллектуального указателя на основе кучи, и этот оператор вел себя по-разному, когда объект находился внутри указателя.

У меня больше нет кода, но там была причина для этого в то время. Это, конечно, не решение принимать всерьез, эта дорога усеяна трупами.

1 голос
/ 16 октября 2010

Одной из веских причин перегрузки может быть его private, чтобы пользователи не могли его использовать. Я не могу вспомнить ни одного примера из реальной жизни, где вы хотели бы предотвратить это, но, похоже, это самая логичная причина его перегрузки.

1 голос
/ 16 октября 2010

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

0 голосов
/ 16 октября 2010

Я перегрузил этот оператор при написании классов для взаимодействия с Direct3D. Это был класс интеллектуальных указателей, который должен был возвращать оператор T **, чтобы его можно было использовать в функциях, ожидающих указатель на указатель. Семантика T ** встречается редко, но в некоторых ситуациях она вам нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...