2012-12-04 5 views
6

noti che le seguenti due funzioni hanno lo stesso tipo e firma:Perché i modificatori di argomento (ad esempio, 'const' o 'volatile') non sono considerati parte del tipo o della firma di una funzione?

void foo1(int t) {} // foo1 has type 'void(*)(int)', and signature '(*)(int)' 
void foo2(const int t) {} // Also type 'void(*)(int)', signature '(*)(int)' 

(il const non fa parte del tipo di funzione o la firma funzione). Analogamente, un modificatore (const o volatile) sul tipo restituito non influenza il tipo di funzione o la firma della funzione.

Tuttavia, nella definizione della funzione stessa (non mostrata), la variabile denominata t mantiene la qualifica const in foo2.

Ci sono molte domande StackOverflow discutere il motivo per cui il tipo ritorno della funzione non è considerata come parte della funzione di firma (utilizzato per la risoluzione di sovraccarico).

Tuttavia, non riesco a trovare alcuna domanda StackOverflow che chiede perché i modificatori degli argomenti (const o volatile) non fanno parte del tipo o della firma della funzione. Inoltre, ho cercato direttamente nel documento degli standard C++ 11 e ho trovato difficile sbrogliare.

Qual è la logica alla base del fatto che i modificatori degli argomenti (ad esempio, const e volatile) non fanno parte del tipo o della firma di una funzione?

ADDENDUM Per chiarezza, dalla risposta di R.MartinhoFernandes sotto, devo precisare che in C++ (credo) i modificatori di argomento const e volatile vengono ignorate solo come parte del tipo di funzione/firma se sono top- Modificatori di livello - guarda la risposta qui sotto.

+3

Il tipo di ritorno * è * parte della firma della funzione. Non è considerato per la risoluzione dei sovraccarichi. I due sono idee separate. –

+0

Non posso darti la risposta ufficiale al C++, ma dal punto di vista dell'utente non farebbero differenza. Se un utente chiama foo1 o foo2, l'utente lo farà con un int. È nell'implementazione che il modificatore const avrà un effetto. Dal momento che una firma è fondamentalmente l'interfaccia (a cui interessa l'utente), non sarebbe opportuno differenziare. – RonaldBarzell

+0

@ R.MartinhoFernandes Io non la penso così - vedi, ad esempio, http://stackoverflow.com/questions/13687607/is-the-only-purpose-of-a-function-signature-as-opp-to -type-to-define-dupl –

risposta

11

Qual è la logica alla base del fatto che i modificatori di argomento (cioè, const e volatile) non fanno parte del tipo o della firma di una funzione?

Dal punto di vista del chiamante, non v'è alcuna differenza tra void foo(int) e void foo(int const). Qualsiasi cosa tu passi ad essa non verrà modificata, indipendentemente dal modificatore: la funzione otterrà una copia.

Dal punto di vista realizzatore l'unica differenza è che con void foo(int x) è possibile mutare x (vale a dire la copia locale) nel corpo, ma non si può mutare x con void foo(int const x).

C++ riconosce queste due prospettive. La prospettiva del chiamante viene riconosciuta rendendo le due dichiarazioni void foo(int); e void foo(int const); dichiarando la stessa funzione. La prospettiva dell'attuatore viene riconosciuta consentendo di dichiarare una funzione come void foo(int x); ma definirla come void foo(int const x) { /*...*/ } se si desidera assicurarsi di non assegnare accidentalmente l'argomento.

Si noti che questo si applica solo per il livello superiore const, ad esempio const valido per l'intero tipo. In cose come int const& o int const* il modificatore si applica solo a una parte del tipo, come "puntatore a (const (int))", quindi non è di livello superiore const. In int *const tuttavia, lo const si applica nuovamente all'intero tipo come in "const (puntatore a (int))".

+0

Questo ragionamento si applica alla firma della funzione 'void foo (const int &)'? –

+1

@Dan no, solo per il cosiddetto "primo livello' const' ". In 'const int &' (ovvero 'int const &') il 'const' si applica solo alla parte riferita (' int'), non all'intero tipo. –

+0

Grazie. Non ho capito la distinzione tra "livello superiore" e livello non superiore. –

Problemi correlati