2010-10-16 2 views
4

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

+0

@Johannes: Спасибо! Я никогда не знал о поиске кода Google. Жаль, что я не могу принять комментарий как ответ :) –

ответ

5

У меня 207 реального мира примеры operator &(): Code search 1, Code search 2.

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

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

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

1

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

+0

мой вопрос был -специально - о реальных примерах –

+0

Ты прав Оли. Умный указатель - это классы, которые должны вести себя как указатели и, следовательно, нужны операторы * или даже и перегружены. Взрыв. –

+2

@Samrat: Что, на самом деле, перегружает и для умного указателя дает вам ?! –

1

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

0

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

1

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

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

+1

+1 для страшных предупреждений – KitsuneYMG

Смежные вопросы