Pourquoi n’y a-t-il pas de spécialisation std :: shared_ptr ?

Le standard fournit une spécialisation de template de std::unique_ptr qui appelle correctement le delete[] depuis son destructeur:

 void func() { std::unique_ptr arr(new int[10]); ....... } 

Avec std::shared_ptr cette spécialisation n’est pas disponible, il est donc nécessaire de fournir un paramètre qui appelle correctement delete[] :

 void func() { // Usage shared_ptr array (new double [256], [](double* arr) { delete [] arr; } ); .............. } 

Est-ce simplement un oubli? (de la même manière qu’il existe un std::copy_if ) ou existe-t-il une raison?

Le LWG (groupe de travail de la bibliothèque du comité C ++) a brièvement examiné la possibilité, mais l’idée n’était pas sans controverse. Bien que la controverse ait principalement porté sur une fonctionnalité ajoutée à la proposition shared_ptr qui aurait pu être rejetée (arithmétique sur shared_ptr ).

Mais en fin de compte, la vraie raison est que, bien que cela ait été discuté, le LWG n’a jamais présenté de proposition écrite. Il n’a jamais fait apparaître la liste de priorités de quiconque (y compris la mienne) suffisamment pour mettre du temps dans la rédaction d’une proposition.

Des conversations informelles ont récemment commencé sur ce sujet entre quelques membres du LWG et je l’ai personnellement conçu comme prototype. Mais il n’y a toujours pas de proposition écrite pour cela. Je pense que ce serait un outil supplémentaire décent dans la boîte à outils. Que ce soit ou non, cela arrivera à n’importe qui.

Mettre à jour

La prise en charge des shared_ptr pour shared_ptr maintenant un brouillon TS:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

Mise à jour (2017)

Ceci est maintenant supporté en C ++ 17. Voir le cas 3 de shared_ptr::shared_ptr()