2010-07-12 14 views
7

¿Puedo sobrecargar una función que toma un nombre de referencia o de variable?Problema al pasar por referencia

Por ejemplo cuando trato de hacer esto:

void function(double a); 
void function(double &a); 

Me gustaría que el llamador de esta función para ser capaz de hacer:

double a = 2.5; 
function(a); // should call function(double &a) 
function(2.3); // should call function(double a) 

me gustaría escribir pasar por caso funciones de referencia para un mejor uso de la memoria y una posible manipulación de la variable fuera del alcance, pero sin tener que crear una nueva variable solo para poder llamar a la función.

¿Esto es posible?

Saludos

+1

Creo que esto es generalmente posible, aunque en su ejemplo, ambos llamarán 'function (double a)', ya que es un int, y no puede tomarse como una referencia a un doble. – falstro

+0

perdón por eso, que significa decir que es un doble. Corregido en cuestión ahora –

+0

¿Qué quiere decir con "posible manipulación de la variable fuera del alcance", y cómo funcionaría eso con 'function (2.3)' – Roddy

Respuesta

8

Creo que te estás perdiendo el punto aquí. Lo que realmente debe tener es precisamente esta:

void function(const double &a); 

Nota del "const". Con eso, siempre debes obtener pass-by-reference. Si tiene pass pass no const por referencia, entonces el compilador asumirá correctamente que desea modificar el objeto pasado, que por supuesto es conceptualmente incompatible con la variante pass-by-value.

Con referencias de referencia, el compilador creará felizmente el objeto temporal para usted a sus espaldas. La versión no const no funciona para usted, porque el compilador solo puede crear estas temporarias como objetos "const".

+0

CAVEAT: Si "función" no puede estar en línea, entonces "const double &" podría ser más costoso porque fuerza a "a" a la memoria. La mayoría de los compiladores pasarán dobles en los registros si su modo de argumento es por valor. –

+2

De hecho. La convención en C++ suele pasar los tipos incorporados (int, double, char, pointers, etc.) por valor, y los tipos compuestos (clases y estructuras) por referencia. –

+0

@Tyler, Luther. Por supuesto, ambos son correctos. Supongo que la elección de 'doble' es simplemente un tipo elegido como un ejemplo (levemente pobre) ... – Roddy

0

no creo que la definición:

void function(double a); 
void function(double &a); 

es posible ... ¿Cómo sería el compilador sabe que funcionan para pedir function(x)? Si desea utilizar ambos por Referencia y por Valor, debe usar dos funciones diferentes. Esto también haría que el código sea mucho más fácil de leer que esta sobrecarga ambigua.

+0

Creo que es posible, y la versión de referencia será preferida si es posible . Sin embargo, no tiene nada que respalde ese reclamo. – falstro

+0

Supongo que lo probaré con diferentes compiladores ... – Tapdingo

+0

gcc 4.1.2: error: la llamada de la función 'overload' (int &) 'es ambigua – Tapdingo

1

que lo han probado, y fracasó

Al menos en MSVC2008, esto no es posible - y creo que esto applys a todos C++ - compiladores.

El definiton sí mismo es válido, pero cuando se trata de llamar a la función

function(a); 

con una variable como parámetro, se produce un error de compilación como el compilador es incapaz de decidir qué función debe utilizar.

-1

No, no se puede hacer esto porque ambas funciones producirán efectivamente los mismos nombres destrozados y el enlazador no podría resolver la llamada a la función.

+0

Uhm. No. Un parámetro de referencia no producirá el mismo cambio de nombre como un parámetro normal (copiado). Eso equivaldría a decir que un puntero a doble y un parámetro doble producirían el mismo nombre. – falstro

1
void function(double const &a); // instead of void function(double a); 
void function(double  &a); 
0

No hay ninguna ventaja de pasar los tipos POD por referencia, ya que casi siempre (¿siempre?) Se pasan en un registro. Los tipos complejos (los que consisten en más de una sola variable POD) pasados ​​por referencia constante son usualmente (¿siempre?: D) una forma preferible sobre una copia y un apilado de pila. Incluso puede controlar la creación de temporarios de sus variables de tipo complejo a partir de POD-types creando explicit constructors

Cuestiones relacionadas