NULL è l'errore da un miliardo di dollari, ma non c'è nulla nel sistema di tipi di C ++ per impedirlo. Tuttavia, C ++ ha già la cost-correct, quindi l'implementazione di NULL -correctness sembra banale:
- presenta una parola chiave,
__nonnull, come identificatore nella stessa classe diconst, che può essere inserito solo dopo*in una dichiarazione. - Tutti i puntatori ottenuti dall'operatore
&è__nonnull. - Un valore del puntatore
__nonnullo un riferimentoconstpuò essere automaticamente convertito in un puntatore normale, ma non viceversa senza cast. (T *__nonnullpuò essere convertito inT *eT *__nonnull &può essere convertito inT *const &) -
I riferimenti scrivibili dei puntatori non possono essere convertiti automaticamente tra normale e
__nonnull(T *__nonnull &NON può essere convertito inT *&), cioèint x; int *__nonnull p = &x; int *q = p; // OK int *const &r = p; // OK int *const *s = &p; // OK int *&t = p; // ERROR, don't want to assign NULL to t int **u = &p; // ERROR, don't want to assign NULL to *u -
const_castpuò essere utilizzato per trasmettere un puntatore normale a un puntatore__nonnull, in cui se il puntatore è realmenteNULL, il comportamento non è definito. - Assegnare una costante del puntatore nullo
0,NULLenullptra una variabile puntatore__nonnullè un errore. -
I puntatori
__nonnullnon possono essere inizializzati come default, come un riferimento. - Avere una funzione di libreria standard per convertire un puntatore normale in un puntatore
__nonnull, che genera un'eccezione suNULL. - Viene fornito un avvertimento facoltativo dal compilatore per il dereferenziamento di normali puntatori senza controllo
NULL, che la pratica sta per essere deprecata.
La proposta sopra è valida? Le cose di cui sopra sono sufficienti per un sistema di tipo NULL -safe?