2009-06-22 25 views
10

Ho cercato in un Qt tutorial che utilizza una costruzione che non ho mai visto prima:Cosa significa "(void) new" in C++?

(void) new QShortcut(Qt::Key_Enter, this, SLOT(fire())); 
(void) new QShortcut(Qt::Key_Return, this, SLOT(fire())); 
(void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close())); 

Ho provato questo senza l'(void) e compila e lavora, così che cosa è lo scopo di lo (void)?

+1

Trasforma il livello di avviso del compilatore fino a max. Compila senza (vuoto) e vedi cosa succede. –

+0

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. –

risposta

21

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.

7

Alcuni compilatori C++ daranno un avvertimento se si butta via il valore di ritorno di una funzione del genere. In questo caso, sembra che il codice provochi la memoria, quindi ricevi un avviso. Il (void) dice al compilatore di non emettere l'avviso: "Tratta questa funzione come se restituisse void".

0

Penso che il riferimento restituito dall'istruzione new non sia assegnato a un puntatore. Vedo che viene passato this quindi QT deve fare qualcosa con quel riferimento.