E 'possibile rendere nonnull diventare parte del sistema di tipi C ++?

2

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 di const , che può essere inserito solo dopo * in una dichiarazione.
  • Tutti i puntatori ottenuti dall'operatore & è __nonnull .
  • Un valore del puntatore __nonnull o un riferimento const può essere automaticamente convertito in un puntatore normale, ma non viceversa senza cast. ( T *__nonnull può essere convertito in T * e T *__nonnull & può essere convertito in T *const & )
  • I riferimenti scrivibili dei puntatori non possono essere convertiti automaticamente tra normale e __nonnull ( T *__nonnull & NON può essere convertito in T *& ), 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 è realmente NULL , il comportamento non è definito.

  • Assegnare una costante del puntatore nullo 0 , NULL e nullptr 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 su NULL .
  • 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?

    
posta Michael Tsang 06.01.2017 - 08:08
fonte

1 risposta

2

Is the above proposal viable?

No.

Innanzitutto, non funziona per i tipi definiti dall'utente. Mentre const lo fa. Anche volatile lo fa. E con molti tipi di puntatori intelligenti, il fatto che funzioni con i tipi definiti dall'utente è piuttosto importante.

Secondo, usare const_cast per convertire in __notnull è ... sciocco.

In terzo luogo, C ++ non è C. Se qualcosa è abbastanza importante da ottenere una parola chiave in C ++, allora è abbastanza importante ottenere una parola chiave che non sembra terribile.

In quarto luogo, questo può essere fatto adeguatamente attraverso un tipo semplice. La libreria di supporto delle linee guida C ++ fornisce not_null , che essenzialmente ha le proprietà suggerite. E, a differenza di __notnull , funziona anche con puntatori intelligenti definiti dall'utente (anche se non unique_ptr ).

    
risposta data 06.01.2017 - 16:00
fonte

Leggi altre domande sui tag