¿Qué es const void?

4 minutos de lectura

avatar de usuario
Ajay

la descripción de std::is_void Establece que:

Proporciona el valor de la constante miembro que es igual a verdadero, si T es el tipo void, const void, volátil void, o const volátil vacío.

Entonces, ¿qué podría ser const voido un volatile void ?

Esta respuesta dice que const void el 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 está equivocado) – entonces, ¿qué es const void?

  • La respuesta a la que vincula no indica que no sería válida, indica que sería “sin sentido”, lo que interpretaría como “no ofrece ningún beneficio sobre void sin que const“.

    usuario743382

    17 de junio de 2016 a las 12:13


  • @hvd, la respuesta indica que el compilador debe advertir/error sobre dicha calificación. Por eso, supongo que el estándar C ++ no permite calificaciones con void

    – Ajay

    17 de junio de 2016 a las 12:18

  • La respuesta establece que el compilador debe advertir sobre dicha calificación, no menciona un error y un error sería incorrecto. Ese comentario se trata solo de la calidad de la implementación, no de la conformidad, pero puedo entender que eso no está del todo claro en el comentario en sí.

    usuario743382

    17 de junio de 2016 a las 12:20

  • @Ajay, el estándar no especifica que debería haber una advertencia cuando usa código sin sentido. Fue una decisión de gcc darle una pista adicional de que este código no hace nada. Pero VC no se equivoca de ninguna manera.

    – Alicia Bytes

    17 de junio de 2016 a las 12:22


  • @Ajay La respuesta establece que clang da una advertencia y que, en opinión del autor, otros compiladores deberían hacerlo. Si el estándar no lo permitiera, sería un error, no una advertencia.

    – molbdnilo

    17 de junio de 2016 a las 12:25

avatar de usuario
benjamin lindley

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 tienes un const void* No puedes static_cast a un int*pero puedes 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

  • Si bien su respuesta es buena, no indica el motivo de const voidpero se trata de punteros nulos y no nulos [ with (non-)const-ness ].

    – Ajay

    17 de junio de 2016 a las 12:27

  • @Ajay: No estoy de acuerdo. A const void* es la única razón por la que alguna vez verías const void. Puede pasarse como un argumento de plantilla, pero ese tipo de argumento solo se instanciará con un * al final de la misma.

    – Benjamín Lindley

    17/06/2016 a las 12:30


  • @BenjaminLindley También puede ver const void en cuestión formulada por un abogado de idiomas

    – aprendiz

    17 de junio de 2016 a las 14:51


  • @Ajay: En algún momento, esta pregunta se convierte en una pregunta de filosofía. La “razón” de const void es que se pueden hacer todos los tipos en C++ const. “Existe” de la misma manera que void existe La respuesta de @Benjamin Lindley explica de qué se trata cuando lo ves y cómo lo usas.

    – Chris Beck

    18 de junio de 2016 a las 19:34

avatar de usuario
Colombo

Como void, const void es un tipo vacío. Sin embargo, si const void es un devolver Escribe el const no tiene sentido (¡aunque sea legal!), porque [expr]/6:

Si un prvalue tiene inicialmente el tipo “CV T“, dónde T es un tipo cv no calificado que no es de clase ni de matriz, el tipo de la 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 Funciones de biblioteca estándar Cdonde se usa para garantizar la corrección constante de los punteros de argumento: int const* no se puede convertir a void*pero void const*.

  • const void como un tipo de retorno afecta el tipo de función, por lo que no es completamente sin sentido.

    – aprendiz

    17 de junio de 2016 a las 14:46

  • @cpplearner Excepto que lo es en todos los sentidos prácticos, porque ni el firma de la función ni el tipo de llamada a la misma se ven afectados.

    – Colombo

    17/06/2016 a las 14:50

  • Bueno, puede cambiar la firma de una plantilla de función. +1 sin embargo

    – aprendiz

    17 de junio de 2016 a las 14:53

  • @cpplearner Bastante justo, sin embargo, todavía es una pérdida de pulsaciones de teclas.

    – Colombo

    17 de junio de 2016 a las 14:55

  • Normalmente vemos: const int * no puede ir a void *, pero const void *.

    – mgouin

    28 de febrero de 2019 a las 21:11

avatar de usuario
DevSolar

Los tipos pueden ser el resultado de plantillas; una plantilla podría indicar const Ty ser instanciado con T como void.

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 puede ser sin sentidopero es codigo valido.

¿Ha sido útil esta solución?