Почему подписи make_shared и allocate_shared различаются для аргументов, которые нужно переслать?
Для того, чтобы создать std::shared_ptr
для данного типа T
Есть два пути среди других: std::allocate_shared
а также std::make_shared
,
Основное отличие (или, по крайней мере, то, что меня интересует в этом вопросе) состоит в том, что первый делает все выделения памяти посредством копии данного распределителя.
Из документации, std::allocate_shared
имеет следующую подпись:
template< class T, class Alloc, class... Args >
shared_ptr<T> allocate_shared( const Alloc& alloc, Args... args );
На другой стороне, std::make_shared
изображается как:
template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
Для них обоих заявлено, что:
args... - список аргументов, с помощью которых будет создан экземпляр T.
С этого момента все кажется правильным (дополнительный распределитель, аргументы и т. Д.).
В любом случае, насколько я понял, оба они должны объявлять аргументы как универсальные ссылки, и это не так (по крайней мере, из того, что я вижу в документации).
Другими словами, не должна подпись std::allocate_shared
быть следующим?
template< class T, class Alloc, class... Args >
shared_ptr<T> allocate_shared( const Alloc& alloc, Args&&... args );
Правильно ли для них быть разными или это ошибка этого сайта?
Если это первый случай, что я упустил в своих рассуждениях?