2014-09-14 17 views
5

Come viene compilato correttamente questo programma?Che cosa significa "void();" come una dichiarazione separata significa in C++?

int main() { 
    void(); // Does this create a "void" object here? 
} 

Ho provato entrambi con MSVC e GCC. Ma void è un tipo incompleto. Quando si esegue lo stesso per qualsiasi altro tipo definito dall'utente incompleta,

class Incomplete; 

int main() { 
    Incomplete(); // Error saying "Incomplete" is incomplete. 
} 
+3

'void' non ha un costruttore. – chris

+0

@chris Sì, ma è come 'int()' o 'float()'. – Alex

+4

@Alex: 'int' e' float' non hanno costruttori. – AnT

risposta

3

void tipo è ed è sempre stato speciale. È infatti incompleto, ma è consentito in molti contesti in cui tipicamente è previsto un tipo completo. In caso contrario, per un esempio, una definizione di una funzione void non sarebbe valida a causa dell'incompletezza del tipo void. È anche possibile scrivere espressioni di tipo void (qualsiasi chiamata a una funzione void è un esempio di tale espressione).

Anche in linguaggio C è possibile utilizzare le espressioni immediate del tipo void come (void) 0. Quello che hai nel tuo codice è solo un esempio di sintassi specifica per C++ che fa essenzialmente la stessa cosa: produce un'espressione non operativa di tipo void.

11

C++ 11 §5.2.3 [expr.type.conv]/2 va in dettaglio (sottolineatura mia):

L'espressione T(), dove T è un identificatore di tipo semplice o identificatore di tipo per un tipo di oggetto completo senza array o il tipo di vuoto (eventualmente qualificato per cv), crea un valore di proto del tipo specificato, il cui valore è quello prodotto dal valore che inizializza (8.5) un oggetto di tipo T; non è stata eseguita l'inizializzazione per il caso void().

È solo un valore di tipo void. Nessuna inizializzazione speciale o qualcosa come int() avrebbe. Un valore di preregolazione è qualcosa come true o nullptr o 2. L'espressione è l'equivalente di 2;, ma per void anziché int.

2

È consentito costruire in C++ che il tipo void possa essere utilizzato come argomento modello.

Problemi correlati