La descripción de std::is_void
establece que:
Proporciona el valor de la constante del miembro que es igual a verdadero, si T es del tipo void, const void, volatile void o const volatile void.
Entonces, ¿qué podría ser const void
, o un volatile void
?
Esta respuesta indica que el const void
tipo de retorno no sería válido (sin embargo, se compila en VC ++ 2015)
const void foo() { }
Si, por norma, const void
no es válido (VC es incorrecto), ¿qué es const void
?
void
sin ellaconst
".void
Respuestas:
const void
es un tipo al que puede formar un puntero. Es similar a un puntero vacío normal, pero las conversiones funcionan de manera diferente. Por ejemplo, aconst int*
no se puede convertir implícitamente en avoid*
, pero se puede convertir implícitamente en aconst void*
. Del mismo modo, si tiene un,const void*
no puedestatic_cast
hacerlo a unint*
, pero puedestatic_cast
hacerlo a unconst 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
fuente
const void
, pero se trata de punteros vacíos y no vacíos [con (no) constancia].const void*
es la única razón por la que alguna vez veríasconst void
. Se puede pasar como un argumento de plantilla, pero ese tipo de argumento solo se instanciará con un*
al final.const void
en la pregunta formulada por un abogado de idiomasconst void
es que se pueden hacer todos los tipos en C ++const
. "Existe" de la misma manera quevoid
existe. La respuesta de @Benjamin Lindley explica qué es cuando lo ve y cómo lo usa.Como
void
,const void
es un tipo vacío. Sin embargo, siconst void
es un tipo de retorno , noconst
tiene sentido (¡aunque es legal!), Porque [expr] / 6 :Sin embargo, es un tipo válido en sí mismo y ocurre, por ejemplo , en funciones de biblioteca estándar C , donde se usa para garantizar la corrección constante de los punteros de los argumentos:
int const*
no se puede convertir avoid*
, perovoid const*
.fuente
const void
ya que un tipo de retorno afecta al tipo de función, por lo que no es completamente insignificante.Los tipos pueden ser el resultado de plantillas; una plantilla puede declarar
const T
y crear una instancia conT
comovoid
.La respuesta vinculada es engañosa, o más bien, limitada en vista de que se refiere al caso especial de un tipo sin plantilla, e incluso entonces
const void
podría no tener sentido , pero es un código válido .fuente