为了给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 );
他们不同是正确的还是那个网站的错误?
如果这是第一种情况,我在推理中遗漏了什么?