util.smartptr.shared.const / 9 en C ++ 11:
Effets: construit un objet shared_ptr qui possède l'objet p et le deleter d. Les deuxième et quatrième constructeurs doivent utiliser une copie de a pour allouer de la mémoire à un usage interne.
Les deuxième et quatrième constructeurs ont ces prototypes:
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);
Dans la dernière version, util.smartptr.shared.const / 10 est équivalent à notre objectif:
Effets: construit un objet shared_ptr qui possède l'objet p et le deleter d. Lorsque T n'est pas un type de tableau, les premier et deuxième constructeurs activent shared_from_this avec p. Les deuxième et quatrième constructeurs doivent utiliser une copie de a pour allouer de la mémoire à un usage interne. Si une exception est levée, d (p) est appelé.
L'allocateur est donc utilisé s'il est nécessaire de l'allouer dans la mémoire allouée. Sur la base de la norme actuelle et des rapports de défauts pertinents, l'allocation n'est pas obligatoire mais assumée par le comité.
Bien que l'interface de shared_ptr
autorise une implémentation où il n'y a jamais de bloc de contrôle et tout shared_ptr
et weak_ptr
soit placé dans une liste chaînée, il n'y a pas une telle implémentation dans la pratique. De plus, le libellé a été modifié en supposant, par exemple, que le use_count
est partagé.
Le deleter est nécessaire pour déplacer uniquement constructible. Ainsi, il n'est pas possible d'avoir plusieurs exemplaires dans le shared_ptr
.
On peut imaginer une implémentation qui place le délétère dans un cadre spécialement conçu shared_ptr
et le déplace lorsqu'il shared_ptr
est supprimé. Bien que l'implémentation semble conforme, elle est également étrange, d'autant plus qu'un bloc de contrôle peut être nécessaire pour le compte d'utilisation (il est peut-être possible mais encore plus étrange de faire la même chose avec le compte d'utilisation).
DR pertinents que j'ai trouvés: 545 , 575 , 2434 (qui reconnaissent que toutes les implémentations utilisent un bloc de contrôle et semblent impliquer que les contraintes multithread le mandatent quelque peu), 2802 (qui exige que le suppresseur ne se déplace que constructible et empêche ainsi l'implémentation lorsque le deleter est copié entre plusieurs shared_ptr
).