2013-05-24 8 views
5

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

+7

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

risposta

6

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

0

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.