2016-04-27 28 views
6

La proposta N4282 richiede un nuovo tipo di puntatore intelligente non proprietario denominato observer_ptr. Il suo nome di lavoro era exempt_ptr ed è inteso come una sostituzione per "puntatori grezzi". Ma non capisco il suo scopo, in particolare con questo ipotetico codice per quello che è stato progettato per ottenere:Qual è il punto di "Il puntatore intelligente più stupido del mondo?"

struct do_nothing 
{ 
    template <class T> 
    void operator()(T*) { }; // do nothing 
}; 

template <class T> 
    using non_owning_ptr = unique_ptr<T, do_nothing>; 

Anche dopo aver letto l'articolo, non capisco lo scopo di un puntatore intelligente che non fa Niente. Che vantaggio ha su un puntatore non proprietario shared_ptr o raw?

+3

Consente di scrivere codice corretto tramite analisi statica. Ad esempio, se per errore chiami 'delete' su uno di essi, il compilatore ti darà un errore, impedendoti di liberare memoria che non possiedi. –

risposta

8

Hai letto la sezione "Motivazione" da proposal N4282 che hai collegato?

si è spesso dimostrato di essere molto impegnativo e che richiede tempo per un programmatore per ispezionare il codice per discernere l'uso al quale qualsiasi puntatore nudo specifico è messo, anche se tale uso non ha alcun ruolo di gestione a tutti. Come osservò Loïc A. Joly, "non è facile disambiguare un puntatore T * che sta solo osservando i dati ... Anche se servirebbe solo per la documentazione, avere un tipo dedicato avrebbe un certo valore, penso." l'esperienza ci porta ad essere d'accordo con questa valutazione.

In altre parole, è rendere il codice più auto-documentante.

Per esempio, se vedo la seguente funzione:

void do_something(Foo *foo); 

allora io non so se fa_qualcosa sta prendendo la proprietà di foo, vuole un array di Foo di lunghezza indeterminata, solo bisogno di un riferimento ad esso nullable , lo sta usando come parametro di output stile Google C++ Style Guide o è un codice stile C legacy che vuole solo un riferimento.

Tuttavia, se vedo

void do_something(observer_ptr<Foo> foo); 

allora so che è osservare un esempio Foo, e non di più.

Il C++ Core Guidelines ha diversi esempi aggiuntivi (owner, not_null, ecc.) Di utilizzo dei modelli, non per aggiungere funzionalità di runtime, ma per documentare meglio il comportamento.

+0

Does observer_ptr impedisce di scrivere sul ptr avvolto? Inoltre, il problema motivante che stai presentando nella tua risposta può essere risolto da Foo const * ptr. Cosa fornisce un osservatore_ptr che un const-ptr non lo fa? Sono solo interessato alla tua opinione su questo. – denniskb

+0

@denniskb - Non è che 'observer_ptr' possa fare tutto ciò che' Foo const * ptr' non può. (Ecco perché è chiamato "il più intelligente puntatore intelligente del mondo.") È che un 'observer_ptr' può comunicare meglio con altri sviluppatori_ (e, potenzialmente, con strumenti di analisi statici) come viene usato il puntatore. –

+0

thx per il chiarimento. Non sono assolutamente d'accordo con questa affermazione. const è stato creato per questo, è una delle più forti garanzie che puoi fornire in un programma C++. Non vedo il vantaggio di aggiungere una nuova sintassi ridondante con semantica più debole, quando la correttezza costante è stata praticata dagli sviluppatori per decenni. – denniskb