2010-11-18 7 views
5

Aujourd'hui, j'ai découvert qu'il est possible de déclarer une fonction dans un en-tête avec une signature et de l'implémenter dans le fichier source avec une signature (similaire) différente. Par exemple, comme ceci:Définition d'une fonction avec une signature différente

// 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; 
} 

Est-ce autorisé? Ou est-ce l'extension du compilateur (j'utilise g ++ 4.3.0)? Je compile avec le niveau d'avertissement pédant et maximum possible, et je n'obtiens toujours pas d'avertissement ou d'erreur.

+0

Avez-vous lu le la norme? – Abyx

Répondre

12

Aux fins de la détermination d'une signature de fonction, tout haut niveau de qualification const est ignoré. C'est parce que cela n'affecte pas les appelants de fonction. Les paramètres de fonction sont transmis par valeur dans tous les cas, de sorte que la fonction ne peut pas affecter les arguments transmis.

Le niveau supérieur const n'affecte pas le corps de la fonction. Il détermine si le paramètre peut être modifié ou non dans le corps de la fonction. C'est la même fonction que la déclaration cependant. Donc, oui, c'est légal et la déclaration et la définition se réfèrent à la même fonction et non à une surcharge.

Référence standard: 8.3.5 [dcl.fct]/3: "[...] Le type d'une fonction est déterminé en utilisant les règles suivantes: [...] Tout cv-qualifier modifier un paramètre type est supprimé. [...] Ces cv-qualificatifs affectent uniquement la définition du paramètre dans le corps de la fonction, ils n'affectent pas le type de fonction. [...] "

+0

+1 pour "qualificatif de niveau supérieur". Vous ne pouvez pas être plus clair que ça. –

+0

Génial. Ce paragraphe répond même à ma question. –

5

Depuis int est un type de valeur de base, le modificateur const n'a aucun effet ici. Peu importe ce que vous faites à votre int dans la fonction, cela ne sera jamais vu par l'appelant.

Vous ne pouvez pas faire cela avec int &. Dans ce cas, la présence ou l'absence de const est vraiment pertinente pour l'appelant, puisque l'int référencé pourrait être modifié.

Questions connexes