¿Qué razones legítimas existen para sobrecargar el operador unario?

De acuerdo, me han inspirado para hacer algunos golpes en la cabeza . Parece una sobrecarga del operator& lleva a una pequeña cantidad de dolor.

¿Qué casos legítimos existen para sobrecargarlo?

(No puedo decir que alguna vez lo haya hecho …)

Me parece recordar algo así como una clase de puntero inteligente que anuló al operator& porque quería devolver la dirección del puntero contenido en lugar de la dirección del objeto del puntero inteligente. No recuerdo dónde lo vi o si me pareció una buena idea en ese momento.

Aha, recordado: CComPtr de Microsoft.

Editar: para generalizar, podría tener sentido bajo las siguientes condiciones:

  • Usted tiene un objeto que se hace pasar por otro objeto.
  • Este objeto puede obtener un puntero a la cosa en la que se está enmascarando.

Devolver algo que no sea un puntero legítimo violaría el principio de menos asombro .

Es útil cuando se representa la operación & en la notación de marcador de posición lambda, por ejemplo &_1[_2] .

Sobrecarga unario & hace que su objeto se comporte como una referencia (en ese sentido).

Estoy bastante seguro de que es una tontería intentar ofrecer alternativas a las referencias incorporadas, en particular dado que las referencias no son objetos en absoluto en C ++, y no tienen sus propias direcciones. Las instancias de su tipo definido por el usuario inevitablemente son objetos y tienen direcciones, incluso si deshabilita la forma normal de obtener esa dirección. Entonces nunca es una imitación perfecta.

Pero la gente está muy interesada en las alternativas definidas por el usuario para los indicadores, por lo que puedo ver cómo alguien podría querer intentarlo. No estoy seguro de que eviten crear un tipo que (mal) se comporte de manera que haga que sus usuarios deseen no haberse molestado.

Cuatro años después, otra respuesta.

Otro uso que he visto es cuando estás utilizando el lenguaje C ++, pero definiendo tu propia semántica. Primer ejemplo: Boost.Spirit.

Boost.Spirit, en particular Qi para el análisis, sobrecarga a los operadores en analizadores para proporcionar una syntax similar a EBNF para especificar objetos analizadores arbitrarios. En particular, el operador unario está sobrecargado para proporcionar el analizador de Predicción And-Predicate .

And-Predicate Parser (& a)

Descripción

Los predicados sintácticos afirman que se cumple una cierta syntax condicional antes de evaluar otra producción. De forma similar a los predicados semánticos, eps, los predicados sintácticos no consumen ninguna entrada. El predicado-and, y a, es un predicado sintáctico positivo que devuelve una coincidencia de longitud cero solo si su predicado coincide.

Ejemplo de uso:

Ejemplo básico de búsqueda anticipada: asegúrese de que el último carácter sea un punto y coma, pero no lo consum, simplemente eche un vistazo al siguiente carácter:

 test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false); 

En resumen, el unario no tiene ninguna relación con los punteros; tiene una semántica específica del dominio que se aplica a los objetos del analizador Qi.

Lo hice con buenos resultados en el contexto de una DSL que genera código LLVM. Un ejemplo ilustrará. Diga y son valores (es decir, objetos de tipo value ). Entonces, la expresión x+y emite una instrucción ADD en algún flujo de código. Muy sensiblemente, la expresión &x emite una instrucción para tomar la dirección de x .

Una vez que solía anular operador & (sin alterar su comportamiento) como privado a la clase, para proteger contra la creación ocasional de puntero inteligente para el objeto creado en la stack. Todavía no estoy seguro de si realmente fue una buena idea …

Puede sobrecargar el operador de dirección para hacerlo privado. Esto podría ser útil para implementar algún tipo de esquema de pase de testigo, donde no se puede tomar la dirección del testigo. Si los constructores del bastón están ocultos, esto puede mantener el scope del bastón hermético.