util.smartptr.shared.const / 9 in C ++ 11:
Effetti: crea un oggetto shared_ptr che possiede l'oggetto pe il deleter d. Il secondo e il quarto costruttore devono utilizzare una copia di a per allocare memoria per uso interno.
Il secondo e il quarto costruttore hanno questi prototipi:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
Nell'ultima bozza, util.smartptr.shared.const / 10 è equivalente al nostro scopo:
Effetti: crea un oggetto shared_ptr che possiede l'oggetto pe il deleter d. Quando T non è un tipo di array, il primo e il secondo costruttore abilitano shared_from_this con p. Il secondo e il quarto costruttore devono utilizzare una copia di a per allocare memoria per uso interno. Se viene generata un'eccezione, viene chiamato d (p).
Quindi l'allocatore viene utilizzato se è necessario allocarlo nella memoria allocata. Sulla base dello standard attuale e delle relative relazioni sui difetti, l'assegnazione non è obbligatoria ma è assunta dal comitato.
Sebbene l'interfaccia di shared_ptr
consenta un'implementazione in cui non esiste mai un blocco di controllo e tutti shared_ptr
e weak_ptr
sono inseriti in un elenco collegato, in pratica non esiste tale implementazione. Inoltre, il testo è stato modificato ipotizzando, ad esempio, che use_count
sia condiviso.
Il deleter è tenuto a muoversi solo costruibile. Pertanto, non è possibile avere più copie nel file shared_ptr
.
Si può immaginare un'implementazione che inserisce il deleter in uno appositamente progettato shared_ptr
e lo sposta quando lo speciale shared_ptr
viene eliminato. Sebbene l'implementazione appaia conforme, è anche strano, soprattutto perché potrebbe essere necessario un blocco di controllo per il conteggio degli usi (è forse possibile ma anche più strano fare la stessa cosa con il conteggio degli usi).
DR rilevanti che ho trovato: 545 , 575 , 2434 (che riconoscono che tutte le implementazioni utilizzano un blocco di controllo e sembrano implicare che i vincoli multi-thread lo obbligano in qualche modo), 2802 (che richiede che il deleter si muova solo costruibile e quindi impedisce l'implementazione in cui il deleter viene copiato tra diversi shared_ptr
).