Почему нет специализации 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 ответ:
РГПВ (библиотечная рабочая группа комитета по С++) кратко рассмотрела эту возможность, но эта идея не была бесспорной. Хотя спор был в основном о функции, добавленной к
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()