Penso che dovrebbe essere consentito e considerato valido in tutte le lingue. Se si dispone di una funzione il cui tipo restituito è void
e si restituisce il risultato di un'espressione il cui tipo è void
(ad esempio chiamando un'altra funzione void
), è stato soddisfatto tale vincolo.
Non è considerato utile farlo in C (anche se penso che possa essere consentito) perché non c'è motivo di averne bisogno.Ogni volta che si fa:
return someVoidFn();
È sempre possibile tradurre la a:
someVoidFn();
return;
E ottenere lo stesso effetto esattamente.
Tuttavia, in C++ e Java, la restituzione di una funzione void
ha un uso reale, e questo perché tali lingue hanno modelli e generici. Considerate questo (non molto utile) classe Java:
class NestedIdentity<T> {
T run(int i, T value) {
if (i == 0) return value;
return run(i - 1);
}
}
Il suo metodo di run
restituisce il valore che si passa ad esso, dopo aver chiamato in sé un certo numero di volte. Lo so, inutile, vero? Ma la parte importante è che T
può essere annullato. Si può fare questo:
NestedIdentity<Void> nest = new NestedIdentity<Void>();
nest(5, null);
E questo funziona. In Java, Void
(nota la maiuscola) crea un'istanza di un generico con un tipo-void
-like il cui unico valore è null
. Se Java non consente di restituire un'espressione void
in un metodo void
, dovrebbe essere un errore in fase di compilazione per creare un'istanza generica con vuoto.
Ha senso ma non in Java o C++ per cui restituire vuoto è denotato da un ritorno senza argomento. Ad ogni modo, spesso vedi una funzione di ritorno del vuoto come una procedura, cioè un pezzo di codice con un effetto collaterale, piuttosto che una funzione che calcola ... nessun valore. –
Beh sì, dipende dalla lingua. Potresti facilmente immaginare un linguaggio chiamato Vava che è lo stesso di Java tranne per questa cosa. –
Ricorda che entrambi questi linguaggi si sono evoluti da C che originariamente non aveva "void". Tutte le funzioni sono state definite per restituire qualcosa ('int' di default), e potresti assegnare una variabile al risultato di una funzione che non ha mai effettivamente restituito un valore, dandoti spazzatura. Dall'altra parte, in Algol/Pascal/Ada, scrivi una 'procedure' (che non restituisce un valore) o una' funzione' (che lo fa). Si potrebbe dire che una funzione 'void' è un tentativo di aggiungere una' procedure' a C per aiutare a prevenire l'uso di risultati garbage di funzioni che non restituiscono nulla. – ajb