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
__nonnull
o un riferimentoconst
può essere automaticamente convertito in un puntatore normale, ma non viceversa senza cast. (T *__nonnull
può 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_cast
può 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
,NULL
enullptr
a una variabile puntatore__nonnull
è un errore. -
I puntatori
__nonnull
non 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?