¿Qué razones legítimas existen para sobrecargar al operador único?


Bueno, he sido inspirado para hacer algunos puñetazos en la cabeza . Parece que la sobrecarga operator& conduce a no una pequeña cantidad de dolor.

¿Qué casos legítimos existen para sobrecargarlo?

(No puedo decir que haya hecho eso....)

Author: Community, 2011-06-27

7 answers

Me parece recordar algo como una clase smart pointer que anuló operator& porque quería devolver la dirección del puntero contenido en lugar de la dirección del objeto smart pointer. No puedo recordar dónde lo vi o si parecía una buena idea en ese momento.

Aha, recordado: Microsoft CComPtr.

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

  • Tienes un objeto que es haciéndose pasar por otro objeto.
  • Este objeto puede obtener un puntero a la cosa que se está enmascarando como.

Devolver cualquier cosa que no sea un puntero legítimo violaría el principio del menor asombro.

 52
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 17:01:57

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

 10
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-21 09:19:30

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

Estoy bastante seguro de que es una tontería intentar proporcionar alternativas a las referencias integradas, en particular porque 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. Así que nunca es un perfecto imitación.

Pero, la gente está muy interesada en alternativas definidas por el usuario a los punteros, por lo que puedo ver cómo alguien podría querer intentarlo. No estoy seguro de que evitarán crear un tipo que (mal)se comporta de maneras que harán que sus usuarios deseen no haberse molestado.

 9
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 23:24:39

Cuatro años después, otra respuesta.

Otro uso que he visto es cuando estás sacando a cuestas el lenguaje C++, pero definiendo tu propia semántica. Ejemplo principal: Boost.Espíritu.

Aumentar.Spirit, en particular Qi para el análisis, sobrecarga los operadores en los analizadores para proporcionar una sintaxis similar a EBNF para especificar objetos de análisis arbitrarios. En particular, el operador unario & está sobrecargado para proporcionar el Analizador Y-Predicado.

And-Predicate Parser (&a)

Descripción

Los predicados sintácticos afirman que una cierta sintaxis condicional debe satisfacerse antes de evaluar otra producción. Similar a los predicados semánticos, eps, predicados sintácticos no consumen ninguna entrada. El and-predicate, & a, es un predicado sintáctico positivo que devuelve un la longitud cero coincide solo si su predicado coincide.

Ejemplo de uso:

Ejemplo básico: asegúrese de que el último carácter es un punto y coma, pero no lo consuma, solo eche un vistazo al siguiente carácter:

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

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

 8
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 05:43:33

He hecho esto con buen efecto en el contexto de un DSL que genera código LLVM. Un ejemplo ilustrará. Decir x y 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 acertadamente, la expresión &x emite una instrucción para tomar la dirección de x.

 7
Author: AndyJost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-15 20:55:56

Una vez usé para anular el operador & (sin alterar su comportamiento) como privado de la clase, con el fin de proteger contra la creación ocasional de puntero inteligente al objeto creado en la pila. Todavía no estoy seguro de si fue realmente buena idea...

 -1
Author: Andrey Betenev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-04 05:46:19

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

 -3
Author: Thomas Eding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-13 18:12:03