Pregunta

He estado mirando un Qt tutorial que usa una construcción I no he visto antes:

 (void) new QShortcut(Qt::Key_Enter, this, SLOT(fire()));
 (void) new QShortcut(Qt::Key_Return, this, SLOT(fire()));
 (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));

He intentado esto sin el (void) y todavía se compila y funciona, entonces, ¿cuál es el propósito del (void) ?

¿Fue útil?

Solución

Lanzar una expresión a (void) básicamente le dice al compilador que ignore el resultado de esa expresión (después de calcularla).

En su ejemplo, cada una de las expresiones (por enunciado / línea) está asignando memoria dinámicamente a través del nuevo operador, y dado que new devuelve un puntero (dirección) a la memoria, la práctica habitual es almacenar ese puntero en una variable que puede usar para eliminar eventualmente el objeto y desasignar la memoria. En su ejemplo, dado que el puntero se está descartando, una conversión explícita a (nula) deja en claro la intención del programador: "Sé exactamente lo que estoy haciendo; descarte el valor devuelto por nuevo"

Si está interesado en los tecnicismos (citando el estándar C ++, cláusula 5):

  

Cualquier expresión puede convertirse explícitamente a tipo cv void. El valor de la expresión se descarta. [Nota: sin embargo, si el valor está en una variable temporal (12.2), el destructor para esa variable no se ejecuta hasta el tiempo habitual, y el valor de la variable se conserva con el propósito de ejecutar el destructor. & # 8212; nota final]
  Las conversiones estándar lvalue-to-rvalue (4.1), array-to-pointer (4.2) y function-to-pointer (4.3) no se aplican a la expresión.

Y si se pregunta cómo se eliminan esos objetos (si de hecho se eliminan), la respuesta es que el puntero 'this' dentro del constructor de QShortcut debería tener el mismo valor que el devuelto por new, y que se puede pasar a un ShortcutManager. Tenga en cuenta que 'this' dentro del constructor no es lo mismo que el puntero 'this' que se pasa al constructor de QShortcut.

Otros consejos

Algunos compiladores de C ++ emitirán una advertencia si descarta el valor de retorno de una función como esa. En este caso, parece que el código pierde memoria, por lo que recibe una advertencia. El (void) le dice al compilador que no emita la advertencia: " Trate esta función como si devolviera void " ;.

Creo que la referencia devuelta por la instrucción new no está asignada a un puntero. Veo que this se está pasando, por lo que QT debe hacer algo con esa referencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top