2009-06-22 16 views
10

He estado buscando en un cuarto de galón tutorial que utiliza una construcción que no he visto antes:¿Qué significa "(vacío) nuevo" en C++?

(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 la (void) y todavía compila y obras, para lo que es el propósito de el (void)?

+1

Convierta su nivel de advertencia de compilación hasta max. Compila sin el (vacío) y mira qué pasa. –

+0

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. –

Respuesta

21

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.

7

Algunos compiladores de C++ darán una advertencia si descarta el valor de retorno de una función como esa. En este caso, el código parece que 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".

0

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