Почему у типа shared_ptr нет параметра распределения шаблонов?

shared_ptr определяется как

template< class T > class shared_ptr;

пользовательский распределитель передается как аргумент конструктора

template< class Y, class Deleter, class Alloc >
shared_ptr( Y* ptr, Deleter d, Alloc alloc );

Почему нет

template< class T, class Alloc = std::allocator<T> > class shared_ptr;

?

У меня такое ощущение, что в некоторых случаях это облегчает жизнь, но, с другой стороны, мешает делать что-то вроде:

namespace App{
    template <typename T>
    using Shared = std::shared_ptr<T,myAllocator<T>>; //pool allocator for control blocks
}

Также make_shared не позволяет этого, потому что уже принимает в качестве аргументов аргументы конструктора.

Любые идеи?


person CoffeDeveloper    schedule 04.01.2014    source источник
comment
en.cppreference.com/w/cpp/memory/shared_ptr/allocate_shared   -  person Mat    schedule 04.01.2014


Ответы (1)


Это не облегчило бы жизнь, поскольку искусственно ограничивало бы любого клиента shared_ptr либо привязкой к одному конкретному типу распределителя, либо самим шаблоном на типе распределителя.

Только некоторые конструкторы и функции (например, некоторые перегрузки reset) должны знать о распределителе, используемом для выделения общего объекта. Многие клиенты могут с радостью не зависеть от распределителя.

Меньшее количество параметров шаблона в типе меньше ограничивает. Обратите внимание, что параметры шаблона для типов классов обычно должны указываться явно, тогда как в шаблонах функций их часто можно вывести из параметров.

person CB Bailey    schedule 04.01.2014