A descrição dos std::is_void
estados que:
Fornece o valor da constante do membro igual a true, se T for do tipo void, const void, volatile void ou const volatile void.
Então o que poderia ser const void
, ou um volatile void
?
Esta resposta afirma que o const void
tipo de retorno seria inválido (no entanto, compila em VC ++ 2015)
const void foo() { }
Se, por padrão, const void
for inválido (VC estando errado) - então o que é const void
?
void
semconst
".void
Respostas:
const void
é um tipo para o qual você pode formar um ponteiro. É semelhante a um ponteiro void normal, mas as conversões funcionam de maneira diferente. Por exemplo, aconst int*
não pode ser convertido implicitamente em avoid*
, mas pode ser convertido implicitamente em aconst void*
. Da mesma forma, se você tem umconst void*
que você não podestatic_cast
-lo para umint*
, mas você podestatic_cast
-lo para umconst 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
fonte
const void
, mas tudo em torno de ponteiros vazios e não vazios [com (não) constância].const void*
é a única razão que você veriaconst void
. Pode ser passado como um argumento de modelo, mas esse tipo de argumento só será instanciado com um*
no final dele.const void
na pergunta feita pelo advogado linguagemconst void
disso é que todos os tipos em C ++ podem ser criadosconst
. Ele "existe" da mesma maneira quevoid
existe. A resposta de @Benjamin Lindley explica o que é quando você o vê e como o usa.As
void
,const void
é um tipo vazio. No entanto, seconst void
for um tipo de retorno , oconst
não faz sentido (embora seja legal!), Porque [expr] / 6 :No entanto, é um tipo válido em si mesmo e ocorre em, por exemplo , funções de biblioteca padrão C , onde é usado para garantir exatidão constante de ponteiros de argumento:
int const*
não pode ser convertido paravoid*
, masvoid const*
.fonte
const void
como um tipo de retorno afeta o tipo de função, portanto, não é completamente sem sentido.Os tipos podem ser o resultado de modelos; um modelo pode indicar
const T
e ser instanciado comT
comovoid
.A resposta vinculada é enganada, ou melhor, limitada, visto que se refere ao caso especial de um tipo não modelo e, mesmo assim,
const void
pode não ter sentido , mas é um código válido .fonte