Ainda é seguro excluir nullptr em c ++ 0x?

Em c++03 , é bastante claro que a exclusão de um ponteiro nulo não tem efeito. De fato, é explicitamente declarado em §5.3.5/2 que:

Em qualquer alternativa, se o valor do operando de exclusão for o ponteiro nulo, a operação não terá efeito.

No entanto, no atual rascunho para o c++0x esta sentença parece estar faltando. No resto do rascunho, só consegui encontrar sentenças informando o que acontece se o operando da expressão de exclusão não for a constante de ponteiro nulo. Está excluindo o ponteiro nulo ainda definido em c++0x e, em caso afirmativo, onde?

Notas:

Há evidências circunstanciais significativas para sugerir que ainda está bem definido.

Primeiro, há as duas sentenças no §5.3.5/2 declarando que

Na primeira alternativa (delete object), o valor do operando delete pode ser um valor de ponteiro nulo, …

e

Na segunda alternativa (matriz de exclusão), o valor do operando de exclusão pode ser um valor de ponteiro nulo ou …

Estes dizem que o operando pode ser nulo, mas por si só não define o que acontece se for.

Segundo, mudar o significado de delete 0 é uma grande mudança, e o comitê de padrões seria muito improvável de fazer essa mudança em particular. Além disso, não há menção de que isso seja uma alteração urgente no Anexo de Compatibilidade (Anexo C) do esboço c++0x . O Anexo C é, no entanto, uma seção informativa, de modo que isso não tem relação com a interpretação da norma.

Por outro lado, o fato de excluir o ponteiro nulo não ter nenhum efeito implica uma verificação adicional em tempo de execução. Em muitos códigos, o operando nunca pode ser nulo, portanto, essa verificação de tempo de execução está em conflito com o princípio de sobrecarga zero. Talvez o comitê tenha decidido mudar o comportamento para trazer o padrão c ++ mais de acordo com os objectives de design da linguagem.

5.3.5 / 7 diz:

Se o valor do operando da expressão de exclusão não for um valor de ponteiro nulo, a expressão de exclusão chamará uma function de desalocação (3.7.4.2). Caso contrário, não é especificado se a function de desalocação será chamada.

E 3.7.4.2/3 diz:

O valor do primeiro argumento fornecido para uma function de desalocação pode ser um valor de ponteiro nulo; se for o caso, e se a function de desalocação for uma fornecida na biblioteca padrão, a chamada não terá efeito.

Portanto, o comportamento é bem definido, contanto que a function de desalocação padrão seja usada ou uma function de desalocação fornecida pelo usuário manipule corretamente os pointers nulos.

Por outro lado, o fato de excluir o ponteiro nulo não ter nenhum efeito implica uma verificação adicional em tempo de execução.

O novo texto não remove essa verificação de tempo de execução para um ponteiro nulo. O contrário: o padrão de rascunho chega ainda mais perto de dizer que uma implementação deve fazer um teste de ponteiro nulo para ser compatível.

Também digno de nota: O antigo padrão se contradizia em que dizia (5.3.5 / 2) que “se o valor do operando de deletar é o ponteiro nulo a operação não tem efeito” mas depois disse que (5.3.5 / 7) o “delete-expression chamará uma function de desalocação”. Chamar uma function é um efeito. Isso é particularmente verdade já que a function que é chamada pode muito bem ser uma operator delete .

A nova redação elimina essa contradição, explicitamente deixando para a implementação se a function de desalocação é chamada no caso de excluir um ponteiro nulo.