2010-11-18 45 views
5

Hoy descubrí que es posible declarar una función en un encabezado con una firma e implementarla en el archivo fuente con una firma diferente (similar). Por ejemplo, así:Definición de una función con firma diferente

// THE HEADER example.hpp 

#ifndef EXAMPLE_HPP 
#define EXAMPLE_HPP 

int foo(const int v); 

#endif 

// THE SOURCE FILE example.cpp 

#include "example.hpp" 

int foo(int v) // missing const 
{ 
    return ++v; 
} 

¿Esto está permitido? ¿O es esta la extensión del compilador (estoy usando g ++ 4.3.0)?

EDITAR Estoy compilando con el nivel de alerta pedante y máxima posible, y todavía no estoy recibiendo una advertencia o un error.

+0

¿Leyó el ¿estándar? – Abyx

Respuesta

12

Para los fines de determinar una firma de función, se ignora cualquier nivel superiorconst calificador. Esto se debe a que no afecta a los llamadores de función. Los parámetros de función se pasan por valor en cualquier caso, por lo que la función no puede afectar los argumentos pasados.

El nivel superior const afecta el cuerpo de la función. Determina si el parámetro puede o no modificarse en el cuerpo de la función. Sin embargo, es la misma función que la declaración.

Así que sí, es legal y la declaración y la definición se refieren a la misma función y no a una sobrecarga.

Referencia estándar: 8.3.5 [dcl.fct]/3: "[...] El tipo de una función se determina usando las siguientes reglas. [...] Cualquier cv-calificador modificando un parámetro tipo se borra. [...] Tales cv-calificadores afectan solo a la definición del parámetro dentro del cuerpo de la función; no afectan el tipo de función. [...] "

+0

+1 para "calificador const nivel superior". No puedes ser más claro que eso. –

+0

Genial. Ese párrafo incluso responde mi pregunta. –

5

Dado que int es un tipo de valor básico, el modificador const no tiene ningún efecto aquí. No importa lo que le haga a su int en la función, esto nunca será visto por la persona que llama.

No puede hacer esto con int &. En ese caso, la presencia o ausencia de const es realmente relevante para la persona que llama, ya que se puede modificar el int referido a.

Cuestiones relacionadas