Какие законные причины существуют для перегрузки унарного оператора&?


хорошо,я был вдохновлен, чтобы сделать некоторые удары головой. Похоже на перегрузку operator& приводит к не малому количеству боли.

какие законные случаи существуют для его перегрузки?

(могу сказать, что я когда-либо делал....)

7 68

7 ответов:

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

Ага, вспомнил: Microsoft CComPtr.

Edit: обобщать, это может смысл в следующем условия:

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

возврат чего-либо, кроме законного указателя, нарушит принцип наименьшего удивления.

это полезно при представлении & операция в обозначении лямбда-заполнителя, например &_1[_2].

перегрузка унарных & делает объект вести себя как ссылка (в этом отношении).

Я уверен, что это дурацкая задача-попытаться предоставить альтернативы встроенным ссылкам, в частности, поскольку ссылки вообще не являются объектами в 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.

когда-то я использовал переопределение operator & (без изменения его поведения) как частное для класса, чтобы защитить от случайного создания интеллектуального указателя на объект, созданный в стеке. Все еще не уверен, что это была действительно хорошая идея...

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