diferencias entre c++ y c++ 11
¿Qué es el vacío constante? (3)
Como
void
,
const void
es un tipo de vacío.
Sin embargo, si
const void
es un tipo de
retorno
, el
const
tiene sentido (¡aunque sea legal!), Porque
[expr]/6
:
Si un valor inicial tiene inicialmente el tipo " cv
T
", dondeT
es un tipo no calificado y sin matriz cv-no calificado, el tipo de expresión se ajusta aT
antes de cualquier análisis posterior.
Sin embargo, es un tipo válido en sí mismo y ocurre, por ejemplo
, en las funciones de biblioteca estándar C
, donde se usa para garantizar la corrección constante de los punteros de argumento:
int const*
no se puede convertir a
void*
, sino
void const*
.
La descripción de
std::is_void
establece que:
Proporciona el valor constante del miembro que es igual a verdadero, si T es el tipo void, const void, volatile void o const volatile void.
Entonces, ¿qué podría ser un
const void
o un
volatile void
?
Esta respuesta
indica que el tipo de retorno
const void
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), entonces ¿qué es
const void
?
Los tipos pueden ser el resultado de plantillas;
una plantilla puede indicar
const T
y ser instanciada con
T
como
void
.
La respuesta vinculada es errónea, o más bien, limitada en cuanto a que se refiere al caso especial de un tipo que no es de plantilla, e incluso entonces,
const void
puede no tener
sentido
, pero es
un código válido
.
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, un
const int*
no se puede convertir implícitamente en un
void*
, pero se puede convertir implícitamente en un
const void*
.
Del mismo modo, si tiene un
const void*
no puede
static_cast
a un
int*
, pero puede
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