I love "const". Vorrei che ogni variabile e metodo che "dovrebbe essere const" sia "const". Il problema è che se una variabile o un metodo "dovrebbe essere const" dipende da metodi/variabili più in basso nell'albero delle chiamate. C'è qualche strumento, o qualche processo, per esaminare staticamente un corpo di codice e fare "en-const-ificazione bottom-up"?facendo variabili C++ const
risposta
Non conosco la risposta alla tua domanda, ma vorrei argomentare contro l'affermazione che
se una variabile o un metodo "dovrebbe essere const" dipende da metodi/variabili, più in basso nella l'albero di chiamata
In realtà, const dovrebbe essere su un livello logico. Cioè dovresti contrassegnare qualcosa const se non dovrebbe essere modificato logicamente. Se lo è in un secondo momento, si otterrà un errore del compilatore e sarà necessario riconsiderare il fatto di cambiare o il presupposto iniziale.
La regola è:
se qualcosa è const, non dovrebbe essere cambiato
piuttosto che
se qualcosa non è cambiato, di fatto, quindi rendiamolo const
Ci sono varie statiche strumenti di analisi che possono farlo. Mi viene in mente Gimpel Flexelint.
Detto ciò, è possibile ottenere risultati che non sembrano abbastanza giusti. Ad esempio, dato questo:
class Wibble {
Some_Implementation_Detail *stuff; //PIMPL idiom
public:
void set_something(int a) { stuff->set(a); }
};
poi set_something può essere fatto const
. Questo è tecnicamente corretto, ma non molto utile, perché non è logicamente lo const
in questo caso.
Non dovresti creare qualcosa 'const' solo perché ti è capitato di usare solo funzioni/funzioni membro' const' che richiedono 'const &'. Dovresti renderlo 'const' perché sai che concettualmente non dovrebbe cambiare. – BoBTFish