Почему нет специализации std::shared ptr?


стандарт предусматривает шаблонную специализацию std::unique_ptr, который правильно называет delete[] из своего деструктора:

void func()
{
   std::unique_ptr< int[] > arr(new int[10]);

   .......
}

С std::shared_ptr эта специализация недоступна, поэтому необходимо чтобы обеспечить deleter, который правильно вызывает delete[]:

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

    ..............
}

это просто недосмотр? (точно так же, как есть std::copy_if) или есть причина?

1 63

1 ответ:

РГПВ (библиотечная рабочая группа комитета по С++) кратко рассмотрела эту возможность, но эта идея не была бесспорной. Хотя спор был в основном о функции, добавленной к shared_ptr<T[]> предложение, которое можно было бы выбросить (арифметика на shared_ptr<T[]>).

но в конечном счете реальная реальная причина заключается в том, что, хотя это обсуждалось, никогда не было фактического письменного предложения перед РГПВ сделать это. Он никогда не пузырился в чьем-либо списке приоритетов (включая мой собственных) достаточно, чтобы вложить время в написание предложения.

недавно вновь начались неофициальные беседы на эту тему между несколькими членами РГПВ,и я лично прототипировал их. Но до сих пор нет письменного предложения по этому поводу. Я думаю, что это будет достойный дополнительный инструмент в наборе инструментов. Произойдет ли это когда-нибудь на самом деле или нет, никто не знает.

обновление

поддержка массив shared_ptr сейчас есть проект ТС:

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

обновление (2017)

теперь это поддерживается в C++17. См. случай 3 из shared_ptr::shared_ptr()