Lanciare un'espressione a (void) in pratica dice al compilatore di ignorare il risultato di tale espressione (dopo averlo calcolato).
Nell'esempio, ciascuna delle espressioni (per istruzione/riga) assegna dinamicamente memoria tramite il nuovo operatore e, poiché la nuova restituisce un puntatore (indirizzo) alla memoria, la prassi usuale è quella di memorizzare quel puntatore in un variabile che è possibile utilizzare per eliminare infine l'oggetto e deallocare la memoria. Nel tuo esempio, poiché il puntatore viene scartato, un cast esplicito a (void) rende chiara l'intenzione del programmatore: "So esattamente cosa sto facendo - per favore scartare il valore restituito dal nuovo"
Se sei interessati ai tecnicismi (citando dallo standard C++, clausola 5):
Qualsiasi espressione può essere convertita in modo esplicito in tipo cv void. Il valore dell'espressione viene scartato. [Nota: tuttavia, se il valore è in una variabile temporanea (12.2), il distruttore per tale variabile non viene eseguito fino al solito orario e il valore della variabile viene conservato allo scopo di eseguire il distruttore. -end note]
Le conversioni standard da lvalue a rvalue (4.1), array-to-pointer (4.2) e function-to-pointer (4.3) non vengono applicate all'espressione.
E se vi state chiedendo come questi oggetti sono sempre cancellati (se davvero stanno ottenendo cancellati), la risposta è che il puntatore 'this' all'interno del costruttore di QShortcut dovrebbe avere lo stesso valore di quello restituito dalla nuova e che può essere passato a un ShortcutManager. Nota, il "this" all'interno del costruttore non è lo stesso del puntatore "this" che viene passato al costruttore di QShortcut.
fonte
2009-06-22 22:38:43
Trasforma il livello di avviso del compilatore fino a max. Compila senza (vuoto) e vedi cosa succede. –
Ma la maggior parte delle volte vedo questo perché qualcuno ha scritto C e non si rende conto che non hai più bisogno della conversione. –