pointer c++ reference undefined-behavior nullptr

null pointer c++



¿Las nullptr hacen referencia al comportamiento indefinido en C++? (2)

// 2. dereference a nullptr pointer and pass it as reference

Desreferenciar un puntero nulo es Comportamiento no definido, por lo tanto, ya sea que lo pase como referencia o valor, lo cierto es que lo ha desreferenciado y, por lo tanto, ha invocado a UB, lo que significa que todas las apuestas están desactivadas.

Ya has invocado a UB aquí:

int &ir = *ip; //ip is null, you cannot deref it without invoking UB.

Esta pregunta ya tiene una respuesta aquí:

El siguiente código engaña con nullptr puntero y referencia:

#include <cstdio> void printRefAddr(int &ref) { printf("printAddr %p/n", &ref); } int main() { int *ip = nullptr; int &ir = *ip; // 1. get address of nullptr reference printf("ip=%p &ir=%p/n", ip, &ir); // 2. dereference a nullptr pointer and pass it as reference printRefAddr(*ip); // 3. pass nullptr reference printRefAddr(ir); return 0; }

Pregunta : En los estándares de C ++, ¿son declaraciones comentadas 1..3 código válido o comportamiento indefinido?

¿Es esto mismo o diferente con las diferentes versiones de C ++ (las más antiguas usarían, por supuesto, 0 literal en lugar de la palabra clave nullptr )?

Pregunta de bonificación: ¿hay compilaciones / opciones de optimización conocidas, lo que en realidad causaría que el código anterior haga algo inesperado / bloqueado? Por ejemplo, ¿existe un indicador para cualquier compilador, que generaría una aserción implícita para nullptr todas partes donde se inicializa la referencia, incluido el argumento de referencia de paso de *ptr ?

Un ejemplo de salida para los curiosos, nada inesperado:

ip=(nil) &ir=(nil) printAddr (nil) printAddr (nil)


Como ir es solo una sombra de *ip , no causará un comportamiento indefinido por sí mismo.

El comportamiento indefinido es usar un puntero que apunta a nullptr_t . Me refiero a usar *ip . Por lo tanto

int &ir = *ip; ^^^

Causa un UB.