2010-11-14 6 views
6

Possible Duplicate:
casting unused return values to voidC++ Qual è lo scopo del lancio a vuoto?

ho letto qualche codice sorgente, e in essa molte funzioni virtuali nelle classi di interfaccia sono dichiarati e default-implementato come tale:

virtual bool FunctionName(TypeName* pointer) 
{ 
    (void)pointer; 
    return true; 
} 

posso chiedere qual è lo scopo di lanciare il puntatore annullare l'implementazione predefinita?

+2

Questo non dovrebbe essere compilato, in quanto la funzione deve restituire un valore. –

+1

Questo è stato chiesto più volte. Lanciare qualcosa a "void" indica che non stai usando il valore di ritorno. Nel tuo caso, è un no-op. – zneak

+0

@zneak: 'pointer' non è un valore restituito. Non è un problema di questa domanda, anche se sono sicuro che anche questo è stato trattato prima per i parametri. –

risposta

18

scopi multipli a seconda di ciò che si lanci

  • Marcatura la vostra intenzione al compilatore che un'espressione che è del tutto una no-op è inteso come scritto (per inibire le avvertenze, per esempio)
  • Marcatura tua l'intenzione al compilatore e al programmatore di ignorare il risultato di qualcosa (il risultato di una chiamata di funzione,
  • In un modello di funzione, se un tipo di ritorno è dato da un parametro modello tipo T, e si restituisce il risultato di alcune chiamate di funzione che potrebbero essere diverse da T in alcune situazioni. Un cast esplicito a T potrebbe, nel caso void, evitare che un errore di compilazione:
    int f() { return 0; } void g() { return (void)f(); }
  • inibizione al compilatore di scegliere un sovraccarico di operatore virgola ((void)a, b sarà mai richiamare una funzione di operatore virgola sovraccaricato).

Nota che le garanzie standard che non ci sarà mai un operator void() chiamato se lanci un oggetto di classe per void (alcune versioni GCC ignorano questa regola, però).

12

In questo caso è solo per evitare l'avvertimento del compilatore sui parametri non utilizzati.

+0

+1: per dare la risposta corretta –

+0

Perché fare un parametro del genere in primo luogo? – stackptr

+1

Il parametro potrebbe verificarsi perché un'altra classe che implementa anche questa funzione virtuale utilizza effettivamente tale parametro. –