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 void
o 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
?
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 void
pero 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íasconst 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 quevoid
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
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óndeT
es un tipo cv no calificado que no es de clase ni de matriz, el tipo de la 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 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
DevSolar
Los tipos pueden ser el resultado de plantillas; una plantilla podría indicar const T
y 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.
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 queconst
“.– 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