5

¿Qué hace el compilador de C++ cuando aparecen los parámetros por defecto ambiguos? Por ejemplo, supongamos que hay una función como:¿Qué hace el compilador de C++ cuando aparecen los parámetros por defecto ambiguos?

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1, int c = 0); 

¿Se considera que lo anterior es ambiguo? Si no, ¿qué hace el compilador (cómo se corresponde exactamente con la función) cuando se llama algo así como function1(10)?

Gracias!

+3

Sus funciones tienen diferentes identificadores. No hay ambigüedad ¿Querías nombrarlos a los dos 'función'? – JoshD

+0

@JoshD: poco probable. El primero tiene 2 parámetros, el segundo - 3. – AnT

+1

@Andrey: La pregunta no tiene sentido a menos que * hay * una ambigüedad, por lo que el comentario de Josh es apropiado. – dmckee

Respuesta

8

El siguiente es bien

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1, int c = 0); 

Y la siguiente es bien también

function(); // calls first function 

Sin embargo, el siguiente es ambigua

function(1); // second and first match equally well 

Para la resolución de sobrecarga (el proceso que dice lo función para llamar), parámetros que no han pasado argumentos explícitos y que hacen uso de defau Sus argumentos son ignorados. Entonces el compilador realmente ve dos funciones que tienen un parámetro int para la llamada anterior y no pueden decidir.

El siguiente es mal formada, aunque

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1); 

Mientras que para el código en su pregunta que declarar dos funciones (ya que ambas declaraciones tienen diferente número de parámetros), en este ejemplo solamente se declara uno función. Pero la segunda declaración repite un argumento predeterminado para un parámetro (e incluso con un valor diferente, pero eso ya no importa). Esto no esta permitido. Tenga en cuenta que la siguiente es bien

void function(int a, float b = 3.1); 
void function(int a = 0, float b); 

El conjunto de argumentos por defecto para las declaraciones que aparecen en el mismo ámbito para la misma función se fusionan, y sólo para los que aparecen en el mismo ámbito. Así que la siguiente es válida

void function(int a = 0, float b = 3.1); 
void function1() { 
    void function(int a, float b = 1.1); 
    function(0); 
} 

Este llama a la función con 1.1 pasado por b.

+1

Es esta función nula (int a = 0, float b); ¿realmente bien? ¿Estás seguro? – Max

1

Si tienen diferentes nombres (como en su ejemplo), no hay ambigüedad. Si tienen el mismo nombre (entonces es un intento de sobrecarga), el compilador se quejará.

Aunque resulta que puede redefinir los argumentos predeterminados a una función en un ámbito diferente (esto es nuevo para mí ...) - pero en el mismo ámbito, no puede redefinir los argumentos predeterminados ni siquiera al mismo valor. desde 8.3.6/4 "argumentos predeterminados":

Para funciones no de plantilla, por defecto argumentos pueden ser añadidos en posteriores declaraciones de una función en el mismo alcance. Las declaraciones en diferentes ámbitos tienen conjuntos completamente distintos de argumentos predeterminados. Es decir, declaraciones en ámbitos internos no adquieren argumentos predeterminados a partir de declaraciones en ámbitos externos y viceversa versa. En una declaración de función dada , todos los parámetros subsiguientes a un parámetro con un argumento predeterminado tendrán los argumentos predeterminados suministrados en esta o en las declaraciones anteriores. Un argumento predeterminado no debe ser redefinido por una declaración posterior (no ni siquiera con el mismo valor).

0

Ambiguous? Usted tiene dos funciones diferentes completamente independientes: function1 y function2. Incluso el número de parámetros en cada función es diferente. No hay ambigüedad aquí en absoluto. Cuando solicite al compilador que llame al function1(10), llama al function1(10, 3.1). function2 ni siquiera aparece en la imagen.

Si fuera la misma función, la cuestión de la ambigüedad no surgiría simplemente porque es ilegal en C++ especificar un argumento predeterminado para el mismo parámetro más de una vez (dentro de la misma unidad de traducción). Incluso de que especifique el mismo valor del argumento por defecto el segundo tiempo, el programa está mal formada

void foo(int a = 5); 
void foo(int a = 5); // <- ERROR 

Lo que se puede hacer sin embargo es especificar un conjunto diferente de los argumentos por defecto para la misma función en traducción diferente unidades. Pero eso no crea ninguna ambigüedad porque el compilador puede ver solo una unidad de traducción. El compilador simplemente nunca sabrá de ninguna posible "ambigüedad" en ese caso.

+0

¿Qué pasaría si fueran dos funciones diferentes con el mismo nombre de función? Creo que eso es lo que realmente significaba el OP. –

-1

Además, la respuesta a cualquier pregunta que comience con "Lo que hace el compilador de C++ ..." siempre será "Depende del compilador del que se trate."

+0

Bien, digamos que fue el compilador de GNU. – laluser

+0

¿Qué versión? .... caracteres de relleno ... –

Cuestiones relacionadas