he encontrado la respuesta a esta pregunta es un rincón inesperado de la C++ draft standard, sección 24.2
requisitos Iterator, concretamente en la sección 24.2.1
En general párrafo y que dicen respectivamente (énfasis mío) :
[...] [Ejemplo: después de la declaración de un sin inicializar puntero x (como se con int * x;), x siempre debe suponerse que tiene un valor singular de un puntero. -finalizar ejemplo] [...] Los valores aderezables siempre son no singulares.
y:
Un iterador es un iterador no válida que puede ser singular.
y la nota 268
dice:
Esta definición se aplica a los punteros, punteros ya son iteradores. El efecto de desreferenciar un iterador que ha sido invalidado no está definido.
A pesar de que parezca que hay cierta controversia sobre whether a null pointer is singular or not y parece que el valor singular término necesita ser adecuadamente definido de una manera más general.
La intención de singular se parece resumirse así en el informe de defectos 278. What does iterator validity mean? en la sección lógica que dice:
¿Por qué decimos "puede ser singular", en lugar de "es singular"? Eso es porque un iterador válido es uno que se sabe que no es. Invalidar un iterador significa cambiarlo de tal manera que ya no se sepa que no es unirular. Un ejemplo: insertar correctamente un elemento en el medio de un vector invalida todos los iteradores que apuntan al vector. Que no significa necesariamente que todos se vuelven singulares.
Así invalidación y ser inicializado may
crear un valor que es singular pero ya que no podemos probar que son no singular debemos asumir que son singular.
actualización
Un enfoque de sentido común alternativa sería tener en cuenta que el proyecto de sección estándar 5.3.1
operadores unarios párrafo que dice (énfasis mío):
El el operador unario * realiza la indirección: la expresión a la que se aplica debe ser un puntero a un tipo de objeto, o un puntero a un tipo de función y el resultado es un valor-I en referencia al objeto o la función a la que los puntos de expresión. [...]
y si a continuación, vaya a la sección 3.10
Lvalues y rvalues párrafo 1 dice (énfasis mío):
un lvalue (la llamada, históricamente, porque lvalues podrían aparecer en el lado izquierdo de una expresión de asignación) designa una función o un objeto. [...]
pero ptr
no será, salvo por casualidad, seleccione un objeto válida.
Supongo que proviene de C Standard 6.5.3.2/4 – Chubsdad
¿Qué dice la norma sobre la inicialización y la declaración de punteros? Por lo que sé, la declaración no inicializa el puntero, por lo que podría ser cualquier cosa, asignando un valor a donde apunte podría hacer cualquier cosa. Podría estar equivocado ;-) – Jaydee
¿No es un comportamiento indefinido leer desde cualquier variable no inicializada, puntero o no? Considere que puede estar escribiendo en la dirección apuntada, pero está leyendo * desde * el puntero en el proceso. –