Pregunta Diferencia entre el análisis de void () e int ()


Después de leer sobre el análisis más irritante, experimenté un poco y encontré este programa. Hay dos líneas muy similares. Uno de ellos arroja advertencias tanto en g ++ 7 como en clang ++ - 3.9, y otro no.

int main() {
  void(); // no warning
  int(); // warning: statement has no effect
}

En la segunda línea, un objeto de tipo construido por defecto int se crea y se destruye inmediatamente, por lo tanto no se usa. ¿Pero qué pasa en la primera línea? Si se analizó de la misma manera, debería ser un error porque es ilegal crear un objeto de tipo void. Por otro lado, tampoco parece una declaración de función.


12
2018-02-21 18:28


origen


Respuestas:


No hay diferencia en el análisis. Ambos casos están cubiertos por simple-tipo-especificador seguido por paréntesis opcional lista de expresion.

El significado semántico se especifica en C ++ 17 (N4659) [expr.type.conv] / 2:

Si el tipo es CV  void y el inicializador es () , la expresión es un prvalue del tipo especificado que no realiza ninguna inicialización. De lo contrario, la expresión es un prvalue del tipo especificado cuyo objeto de resultado se inicializa directamente con el inicializador.

Esto específicamente dice que void() es un prvalue de tipo void.

Ahora, estoy seguro de que no es destinado a que un valor prvalue de tipo void sea ilegal, ya que es una ocurrencia común, p. (void)x; o llamando a una función nula!

Pero no puedo encontrar dónde en el Estándar dice que la materialización temporal debe ser suprimida por void prvalues. El [class.temporary] / 2 parece decir que una expresión de valor descartado siempre materializa un temporal; y es un error materializar un prvalue de tipo incompleto. Tal vez es un defecto en el estándar.


La diferencia en la advertencia sobre el "valor no utilizado" es probablemente debido a un valor de tipo de valor no utilizado void es una ocurrencia común y no sería útil advertirlo.


5
2018-03-28 03:13



Eso es analizado de la misma manera.

Las advertencias no provienen del analizador. Surgen durante el análisis semántico. La SA notó que un valor fue creado y destruido por int(); sin ser leído o escrito.

En el void caso, no hay ningún valor, entonces no hay advertencia.


0
2018-03-28 00:28