Какие законные причины существуют для перегрузки унарного оператора&?
хорошо,я был вдохновлен, чтобы сделать некоторые удары головой. Похоже на перегрузку operator&
приводит к не малому количеству боли.
какие законные случаи существуют для его перегрузки?
(могу сказать, что я когда-либо делал....)
7 ответов:
Я, кажется, помню что-то вроде смарт-класса указателя, который переопределил
operator&
потому что он хотел вернуть адрес содержащегося указателя, а не Адрес объекта интеллектуального указателя. Не могу вспомнить, где я это видел, или это казалось хорошей идеей в то время.Ага, вспомнил: Microsoft CComPtr.
Edit: обобщать, это может смысл в следующем условия:
- у вас есть объект, который маскируется под какой-то другой объект.
- этот объект может получить указатель на то, что он маскируется.
возврат чего-либо, кроме законного указателя, нарушит принцип наименьшего удивления.
перегрузка унарных
&
делает объект вести себя как ссылка (в этом отношении).Я уверен, что это дурацкая задача-попытаться предоставить альтернативы встроенным ссылкам, в частности, поскольку ссылки вообще не являются объектами в C++, и у них нет собственных адресов. Экземпляры вашего пользовательского типа неизбежно являются объектами и имеют адреса, даже если вы отключаете обычный способ получения этого адреса. Так это никогда не бывает совершенной имитацией.
но люди очень заинтересованы в пользовательских альтернативах указателям, поэтому я могу видеть, как кто-то может захотеть попробовать это. Я не уверен, что они избегут создания типа, который (mis)ведет себя так, что его пользователи захотят, чтобы они не беспокоились.
четыре года спустя, другой ответ.
другое использование, которое я видел, - это когда вы отбрасываете язык C++, но определяете свою собственную семантику. Главный пример: повышение.Дух.
импульс.Spirit, в частности Qi для парсинга, перегружает операторы на парсерах, чтобы обеспечить ebnf-подобный синтаксис для указания произвольных объектов парсера. В частности, унарный
&
оператор перегружен, чтобы обеспечить И-Парсер Предикатов.и-парсер предикатов (&a)
описание
синтаксические предикаты утверждают, что определенный условный синтаксис должен быть удовлетворен перед оценкой другого производства. Подобно семантическим предикатам, eps, синтаксические предикаты не потребляют никаких входных данных. Этот и-сказуемого и является позитивным синтаксический предикат, который возвращает нулевая длина совпадает только в том случае, если ее предикат совпадает.
пример использования:
базовый пример с прогнозом: убедитесь, что последний символ-a точка с запятой, но не потребляйте его, просто взгляните на следующий символ:
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
короче говоря, унарный
&
здесь не имеет никакого отношения к указателям вообще; он имеет доменную семантику, которая применяется к объектам Qi parser.
Я сделал это для хорошего эффекта в контексте DSL, который генерирует код LLVM. Я приведу пример. Скажи
x
иy
значения (т. е. объекты типаvalue
). Тогда выражениеx+y
выдает инструкцию ADD в некоторый поток кода. Вполне разумно, выражение&x
выдает инструкцию взять адресx
.