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.