2010-11-18 15 views
5

Heute habe ich festgestellt, dass es möglich ist, eine Funktion in einem Header mit einer Signatur zu deklarieren und in der Quelldatei mit einer anderen (ähnlichen) Signatur zu implementieren. Zum Beispiel so:Definieren einer Funktion mit unterschiedlicher Signatur

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

Ist das erlaubt? Oder ist das die Erweiterung des Compilers (ich verwende g ++ 4.3.0)?

BEARBEITEN Ich kompiliere mit pedantischer und maximal möglicher Warnstufe, und ich bekomme immer noch keine Warnung oder einen Fehler.

+0

Haben Sie die gelesen Standard? – Abyx

Antwort

12

Zum Ermitteln einer Funktionssignatur wird ein Top Levelconst Qualifier ignoriert. Dies ist darauf zurückzuführen, dass Funktionsanrufer nicht betroffen sind. Funktionsparameter werden in jedem Fall als Wert übergeben, so dass die Funktion die übergebenen Argumente nicht beeinflussen kann.

Die oberste Ebene beeinflusst den Hauptteil der Funktion. Sie bestimmt, ob der Parameter im Hauptteil der Funktion geändert werden kann oder nicht. Es ist die gleiche Funktion wie die Deklaration.

Also ja, es ist legal und die Deklaration und Definition beziehen sich auf die gleiche Funktion und keine Überlastung.

Standardreferenz: 8.3.5 [dcl.fct]/3: "[...] Der Typ einer Funktion wird anhand der folgenden Regeln bestimmt. [...] Beliebig cv-qualifier einen Parameter ändern type ist gelöscht. [...] Solche cv-Qualifier betreffen nur die Definition des Parameters innerhalb des Rumpfes der Funktion, sie beeinflussen nicht den Funktionstyp. [...] "

+0

+1 für "Top-Level Const Qualifier". Du kannst nicht klarer werden. –

+0

Großartig. Dieser Absatz beantwortet sogar meine Frage. –

5

Da int ein Basiswerttyp ist, hat der const-Modifikator hier keine Auswirkung. Egal, was Sie mit Ihrem int in der Funktion machen, dies wird vom Aufrufer nie gesehen.

Sie können dies nicht mit int & tun. In diesem Fall ist das Vorhandensein oder Nichtvorhandensein von const für den Aufrufer wirklich relevant, da der int bezogen auf geändert werden könnte.