Se la dichiarazione (e quindi l'inizializzazione e, a un certo punto, destructung) di un oggetto arbitrario ha effetti collaterali visibili non può essere determinata in generale. Il costruttore può chiamare funzioni la cui definizione non è nota al compilatore o può dipendere dallo stato esterno o da qualsiasi altro aspetto che renda il problema indecidibile.
Nel primo caso, il costruttore è banale (nemmeno dichiarato), lo stesso per il distruttore. Siccome lo Object
non ha membri, è chiaro e facilmente rilevabile che lo Object foo
in effetti non fa nulla.
std::vector
ha un costruttore non banale che può essere allocando memoria (stato esterno + funzione la cui definizione non può essere conosciuta (new ...
)) con un distruttore non banale (anche stato esterno + funzione la cui definizione non può essere conosciuto (delete ...
)). Ragionare sul fatto che sia sicuro rimuovere la dichiarazione (emettendo in tal modo un avvertimento che probabilmente dovresti) non è possibile in questo caso, quindi il compilatore deve lasciare la dichiarazione nel codice (e deve presumere che la dichiarazione sia lì per un ragionare).
Un primo esempio è std::lock_guard
che viene utilizzato per bloccare un mutex quando è costruito e sbloccarlo automaticamente quando viene distrutto. Il mutex è quindi mantenuto finché l'oggetto è nel campo di applicazione; generalmente non si può accedere all'oggetto std::lock_guard
, tuttavia è utile dichiararlo. Questo è il principio RAII al lavoro.
Emettere un avviso in questi casi sarebbe un fastidio, portando le persone a disattivare l'avviso, che a sua volta renderebbe l'avviso inutile. (Il compilatore può anche essere progettato in modo tale che emetta solo l'avviso se ha rimosso la dichiarazione durante l'ottimizzazione, che è anche il motivo per cui alcuni avvisi vengono visualizzati solo se determinate ottimizzazioni sono abilitate.)
fonte
2016-06-20 08:53:21
In C++, i costruttori e i distruttori possono contenere una logica non banale. Quindi, in generale, è indecidibile se una dichiarazione di variabili apparentemente inutilizzata possa essere effettivamente eliminata. – pyon
Emette l'avviso quando si aggiunge un costruttore non banale del parametro zero a Object? – lorro