Lanzar una expresión a (vacío) 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 instrucción/línea) está asignando dinámicamente la memoria a través del nuevo operador, y como new devuelve un puntero (dirección) a la memoria, la práctica habitual es almacenar ese puntero en un variable que puede usar para eventualmente eliminar el objeto y desasignar la memoria. En su ejemplo, dado que el puntero se descarta, un lanzamiento explícito a (vacío) deja en claro la intención del programador: "Sé exactamente lo que estoy haciendo - deseche el valor devuelto por el nuevo"
Si usted es interesado en los tecnicismos (citando el estándar C++, cláusula 5):
Cualquier expresión se puede convertir explícitamente a tipo cv void. El valor de 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 la hora habitual, y el valor de la variable se conserva con el fin de ejecutar el destructor. -finalizar]
Las conversiones estándar lvalue-to-rvalue (4.1), array-to-puntero (4.2) y de función a puntero (4.3) no se aplican a la expresión.
Y si se preguntan cómo están siendo eliminados aquellos objetos (si es que están siendo borrados), la respuesta es que el este puntero dentro del constructor de QShortcut debe tener el mismo valor que la devuelta por la nueva y eso se puede pasar a un administrador de acceso directo. Tenga en cuenta que el 'this' dentro del constructor no es lo mismo que el puntero 'this' que se está pasando al constructor de QShortcut.
Convierta su nivel de advertencia de compilación hasta max. Compila sin el (vacío) y mira qué pasa. –
Pero la mayoría de las veces veo esto porque alguien ha estado escribiendo C y no se da cuenta de que ya no necesita la conversión. –