Estándar de C ++: desmarcando el puntero NULL para obtener una referencia?

Me pregunto qué dice el estándar de C ++ sobre un código como este:

int* ptr = NULL; int& ref = *ptr; int* ptr2 = &ref; 

En la práctica, el resultado es que ptr2 es NULL, pero me pregunto si esto es solo un detalle de implementación o está bien definido en el estándar.
En circunstancias diferentes, una eliminación de referencias de un puntero NULL debería provocar un locking, pero aquí estoy desreferenciando para obtener una referencia que el comstackdor implementa como un puntero, por lo que no hay realmente una desreferenciación real de NULL.

Desreferenciar un puntero NULL es un comportamiento indefinido.

De hecho, el estándar llama a esta situación exacta en una nota (8.3.2 / 4 “Referencias”):

Nota: en particular, una referencia nula no puede existir en un progtwig bien definido, porque la única forma de crear dicha referencia sería vincularla al “objeto” obtenido al eliminar la referencia de un puntero nulo, lo que causa un comportamiento indefinido.


Por otro lado: La única vez que soy consciente de que un puntero NULL puede ser “desreferenciado” de una manera bien definida es como el operando del operador sizeof , porque el operando a sizeof no se evalúa en realidad (por lo que la desreferencia en realidad nunca ocurre).

La desreferenciación de un puntero NULL es un comportamiento explícitamente indefinido en el estándar de C ++, por lo que lo que se ve es específico de la implementación.

Copia de 1.9.4 en el borrador del estándar C ++ 0x (similar a las normas anteriores a este respecto):

Algunas otras operaciones se describen en esta norma internacional como no definidas (por ejemplo, el efecto de desreferenciar el puntero nulo). [ Nota : esta Norma Internacional no impone requisitos sobre el comportamiento de los progtwigs que contienen un comportamiento indefinido. – nota final ]

Desreferenciar un puntero NULL es un comportamiento indefinido. Debería verificar si un valor es NULL antes de desreferenciarlo.

Para completar, esto: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 habla específicamente sobre este tema.

 int& ref = *ptr; 

La statement anterior en realidad no desreferencia nada. Así que no hay problema hasta que use la ref (que no es válida).