Почему нет специализации std:: shared_ptr <T []>?

Стандарт предоставляет специализированную специализацию 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

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

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

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

Обновление

Поддержка массива shared_ptr теперь имеет проект TS:

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

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

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