Почему нет std :: shared_ptrспециализация? - PullRequest
64 голосов
/ 21 января 2012

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

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

   .......
}

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

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

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

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

1 Ответ

69 голосов
/ 21 января 2012

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

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

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

Обновление

Поддержка массива для shared_ptr теперь имеет черновой вариант TS:

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

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

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

...