entre diferencias c++ c++11 c++14

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 ", donde T es un tipo no calificado y sin matriz cv-no calificado, el tipo de expresión se ajusta a T 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