Pergunta

Eu estive olhando para um Qt tutorial que utiliza uma construção I não tenha 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()));

Eu tentei isso sem a (void) e ainda compila e obras, então o que é o propósito da (void)?

Foi útil?

Solução

Fundição uma expressão para (void) basicamente diz o compilador para ignorar o resultado dessa expressão (após computar-lo).

No seu exemplo, cada uma das expressões (por declaração / linha) é alocar dinamicamente a memória através do novo operador - e uma vez que novos retornos um ponteiro (endereço) para a memória, a prática usual é a de armazenar esse ponteiro em uma variável que você pode usar para eventualmente excluir o objeto e desalocar a memória. No seu exemplo, uma vez que o ponteiro está sendo descartado, uma conversão explícita para (void) faz com que a intenção do programador clara: "Eu sei exatamente o que estou fazendo - elimine o valor retornado pelo novo"

Se você está interessado nos aspectos técnicos (citando o padrão ++, cláusula 5 C):

Qualquer expressão pode ser explicitamente convertido para digitar cv vazio. O valor da expressão é descartado. [Nota: no entanto, se o valor está em uma variável temporária (12.2), o processo de destruição para que não variável é executado até que o tempo usual, e o valor da variável é preservada para a finalidade de executar o processo de destruição. -end nota]
O rvalue Ivalue-a-(4.1), matriz-se ponteiro (4.2), e função-para-ponteiro (4.3) conversões padrão não são aplicados para a expressão.

E se você está se perguntando como esses objetos estão sendo excluídos (se é que estão ficando excluído), a resposta é que o ponteiro 'this' dentro do construtor de QShortcut deve ter o mesmo valor que devolvido pelo novo, e que pode ser passado para um ShortcutManager. Note, o 'isto' dentro do construtor não é o mesmo que o ponteiro 'this' que está sendo passado para o construtor de QShortcut.

Outras dicas

Alguns C ++ compiladores vai dar um aviso se você joga fora o valor de retorno de uma função como essa. Neste caso, os olhares de código, como vazamentos de memória, de modo a obter um aviso. O (void) diz o compilador não para emitir o aviso: "Trate esta função como se voltou void"

Eu acho que a referência retornada a partir da declaração new não é atribuído a um ponteiro. Vejo que this está sendo passado por isso QT deve fazer algo com essa referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top