2011-09-09 16 views
6

Dado que los operadores unarios de prefijo pueden ser "implementados por una función miembro no estática sin parámetros o una función no miembro con un parámetro" (§13.5.1 [over.unary]/1), ¿hay alguna diferencia además de las razones de diseño de encapsulación/reutilización de código habituales que se aplican a las opciones de función miembro/no miembro?unary minus overload: miembro o no miembro?

Para operadores binarios, there's a semantic difference porque los no miembros permiten conversiones implícitas de sus operandos de la mano izquierda. No parece haber nada de eso para los operadores unarios, pero el estándar define std::complex como un operador de negación unificado (§26.4.6 [complex.ops]), mientras que std::valarray y std::duration 's los operadores de negación unaria son miembros (§26.6.2.6 [valarray.unary], §20.11.5.3 [time.duration.arithmetic]). Hay un matiz?

+1

Al citar secciones específicas del estándar, es posible que desee mencionar a qué versión se refiere. –

+0

@ André Caron Citado de la versión n3290 de C++ 11, por lo que pude mostrar 'duration'. – Cubbi

Respuesta

2

Por lo que yo sé, no hay diferencias en comparación con la decisión de si una función sin operador debe ser miembro o no miembro. Obviamente, prefiero no miembro, no amigo cuando sea posible (como los algoritmos estándar).

0

Usar miembros cuando sea posible tiene más sentido, ya que no tiene que volverse loco con sus amigos. Pero, de lo contrario, es solo una decisión de estilo de código.

+1

¿Qué pasa con las pautas de la nueva era de Sutter/Alexandrescu sobre hacer que todo lo que no sea miembro no sea amigo si es posible? – Cubbi

+0

@Cubbi Sí, siempre es mejor otorgar los menores derechos de acceso posibles, pero prefiero que mi código sea breve. –

Cuestiones relacionadas