So che ci sono alcune domande sulla correttezza const dove si afferma che la dichiarazione di una funzione e la sua definizione non devono necessariamente concordare i parametri di valore. Questo perché la costanza di un parametro di valore interessa solo all'interno della funzione. Questo va bene:Corrispondenza di Const per i parametri di valore
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
Sta facendo questo davvero una buona pratica? Perché non ho mai visto nessuno farlo. Ho visto questa citazione (non sono sicuro della fonte) in altri luoghi questo è stato discusso:
"In fact, to the compiler, the function signature is the same whether you include this const in front of a value parameter or not."
"Avoid const pass-by-value parameters in function declarations. Still make the parameter const in the same function's definition if it won't be modified."
Il secondo comma dice di non mettere il const nella dichiarazione. Presumo questo perché la costanza di un parametro di valore è priva di significato come parte di una definizione di interfaccia. È un dettaglio di implementazione.
In base a questa raccomandazione, è anche consigliato per i valori del puntatore dei parametri del puntatore? (Non ha senso su un parametro di riferimento dal momento che non è possibile riassegnare un riferimento.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
Sommario: Fare parametri di valore è utile per la cattura di alcuni errori di logica. È una buona pratica? Vai all'estremo di lasciare il const fuori dal file di intestazione? È utile tanto per i valori del puntatore const? Perché o perché no?
Alcune referenze:
C++ const keyword - use liberally? Use of 'const' for function parameters
Un esempio di quando i parametri di valore const sono utili:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}
Raggiunge il "se (i = j)" errore in questo caso, ma non cattura tutti questi errori, quindi non mi entusiasmerei troppo per quella particolare logica (dato che puoi fare lo stesso errore con le variabili). Anche senza il const, il compilatore dovrebbe avvisarti di questo se dici di volere degli avvertimenti. – nobar
Il punto di eccitarsi con 'if (i = j)' è rendersi conto che i parametri di valore const non sono solo fluff. L'esempio di Michael Burr è addirittura migliore di questo. – jmucchiello
In una situazione in cui non state modificando i parametri delle funzioni, dovreste constarli perché A) è più sicuro, B) è auto-documentante, e C) è più debug-friendly. Inoltre, il prototipo e l'intestazione devono essere contrassegnati come const. È confuso se solo il fatto nell'intestazione della funzione. L'argomento sulla creazione di una variabile temporanea all'interno della funzione è una situazione in cui probabilmente non è necessario dichiarare il parametro (s) const. Sono i miei 2 centesimi. –