Domanda

Ho visto un Qt tutorial che utilizza una costruzione I non ho mai visto prima:

 (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()));

L'ho provato senza (void) e continua a compilare e funzionare, quindi qual è lo scopo di (void) ?

È stato utile?

Soluzione

Il cast di un'espressione su (void) sostanzialmente dice al compilatore di ignorare il risultato di quell'espressione (dopo averlo calcolato).

Nel tuo esempio, ciascuna delle espressioni (per istruzione / riga) sta allocando dinamicamente la memoria tramite il nuovo operatore - e poiché il nuovo restituisce un puntatore (indirizzo) in memoria, la pratica normale è quella di memorizzare quel puntatore in una variabile che è possibile utilizzare per eliminare infine l'oggetto e deallocare la memoria. Nel tuo esempio, poiché il puntatore viene scartato, un cast esplicito su (void) chiarisce l'intenzione del programmatore: " so esattamente cosa sto facendo - per favore, scarta il valore restituito dal nuovo "

Se sei interessato ai tecnicismi (citando lo standard C ++, clausola 5):

  

Qualsiasi espressione può essere esplicitamente convertita nel tipo cv void. Il valore dell'espressione viene scartato. [Nota: tuttavia, se il valore si trova in una variabile temporanea (12.2), il distruttore per quella variabile non viene eseguito fino al normale orario e il valore della variabile viene conservato allo scopo di eseguire il distruttore. —Endola nota]
  Le conversioni standard lvalue-to-rvalue (4.1), array-to-pointer (4.2) e function-to-pointer (4.3) non vengono applicate all'espressione.

E se ti stai chiedendo come vengono eliminati quegli oggetti (se effettivamente vengono eliminati), la risposta è che il puntatore 'this' all'interno del costruttore di QShortcut dovrebbe avere lo stesso valore di quello restituito da new, e che può essere passato a un ShortcutManager. Nota, "questo" nel costruttore non è uguale al puntatore "questo" che viene passato al costruttore di QShortcut.

Altri suggerimenti

Alcuni compilatori C ++ emettono un avviso se si elimina il valore restituito da una funzione del genere. In questo caso, il codice sembra perdere la memoria, quindi viene visualizzato un avviso. Il (void) dice al compilatore di non emettere l'avvertimento: " Tratta questa funzione come se restituisse void " ;.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top