Почему подписи 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 );

Правильно ли для них быть разными или это ошибка этого сайта?
Если это первый случай, что я упустил в своих рассуждениях?

0 ответов

Другие вопросы по тегам