2016-06-17 19 views
76

La descrizione di std::is_void precisa che:Cosa è const void?

Fornisce il valore costante elemento che è uguale a true, se T è il tipo vuoto, vuoto const, volatile vuoto, o const vuoto volatili.

Quindi cosa potrebbe essere const void o volatile void?

This answer afferma che const void tipo di ritorno sarebbe valida (invece compila il VC++ 2015)

const void foo() { } 

Se dalla norma, const void non è valida (VC essere sbagliato) - allora qual è const void?

+13

La risposta a cui si collega non dichiara che non sarebbe valida, afferma che sarebbe "senza significato", che direi che "non offre alcun vantaggio rispetto a" void' senza 'const'" . – hvd

+0

@hvd, la risposta indica che il compilatore dovrebbe avvertire/errore in merito a tale qualifica. Con ciò presumo che lo standard C++ non permetta le qualifiche con 'void' – Ajay

+2

La risposta afferma che il compilatore dovrebbe mettere in guardia su tale qualifica, non menziona un errore e un errore sarebbe sbagliato.Questa osservazione riguarda solo la qualità dell'implementazione, non la conformità, ma posso capire che ciò non è affatto chiaro dall'osservazione stessa. – hvd

risposta

79

const void è un tipo a cui è possibile creare un puntatore. È simile a un normale puntatore vuoto, ma le conversioni funzionano in modo diverso. Ad esempio, un const int* non può essere convertito implicitamente in un void*, ma può essere convertito implicitamente in un const void*. Allo stesso modo, se si dispone di un const void* non è possibile static_cast a un int*, ma è possibile static_cast a un const int*.

const int i = 10; 
void* vp = &i;       // error 
const void* cvp = &i;     // ok 
auto ip = static_cast<int*>(cvp);  // error 
auto cip = static_cast<const int*>(cvp); // ok 
+2

Mentre la tua risposta è buona, non indica la ragione di "const void", ma i suoi puntatori tutt'intorno vuoti e non void [con (non-) const-ness]. – Ajay

+23

@ Ajay: non sono d'accordo. Un 'const void *' è l'unica ragione per cui potresti mai vedere 'const void'. Potrebbe essere passato come argomento template, ma quel tipo di argomento sarà sempre istanziato con un '*' alla fine di esso. –

+0

@BenjaminLindley Puoi anche vedere 'const void' in [domanda posta dall'avvocato linguistico] (http://stackoverflow.com/questions/37312668) – cpplearner

18

I tipi possono essere il risultato di modelli; un modello potrebbe essere const T e essere istanziato con T come void.

La risposta è collegato ingannati, o meglio, limitata in vista, in quanto riguarda il caso particolare di un tipo non-template, e anche allora const void potrebbe essere insignificante, ma è codice valido.

20

Come void, const void è un tipo vuoto. Tuttavia, se è un const voidritorno tipo, il const non ha senso (anche se legale!), Perché [expr]/6:

Se un prvalue ha inizialmente il tipo “cvT”, dove T è un CV- non qualificato, non-array, il tipo di l'espressione è regolata su T prima di qualsiasi ulteriore analisi.

Tuttavia, è un tipo valido stesso e si verifica ad es. C-standard library functions, in cui viene utilizzato per garantire la costante correttezza dei puntatori agli argomenti: int const* non può essere convertito in void*, ma void const*.

+0

'const void' come un tipo di ritorno ha effetto sul tipo di funzione, quindi non è completamente privo di significato. – cpplearner

+1

@cpplearner Tranne che è in ogni senso pratico, perché non sono interessati né la * firma * della funzione né il tipo di chiamata ad essa. – Columbo

+0

Bene può cambiare la firma di un modello di funzione. +1 comunque – cpplearner