为什么C++11有`make_shared`但没有`make_unique`?

54
这是一个重复问题:
make_unique 和完美转发
为什么C++11有make_shared模板,但没有make_unique模板?
这使得代码非常不一致。
auto x = make_shared<string>("abc");
auto y = unique_ptr<string>(new string("abc"));

1
可能是因为 unique 需要构造一个对象,他们认为显式地完成这个过程更好。 - Bartek Banachewicz
3
不一致的并不是代码,而是库文件。 - Mark Garcia
1
unique_ptr的复制构造函数是私有的。因此,如果没有“返回值优化”,make_unique将无法工作。我猜根据语言规范,这种优化不是强制性的。 - bop
1个回答

64
根据Herb Sutter在这篇文章中所说,这部分是“部分疏忽”。这篇文章包含了一个很好的实现,并且强烈建议使用它。
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
    return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

更新:原始更新已经更新,重点已经更改。


2
@hyde 谢谢。我已经更新了,但新版本中没有包含此答案中的示例实现(可以在评论中找到)。 - juanchopanza
8
make_unique 函数将在 C++14 中与 unique_ptr 一起出现在相同的 memory 头文件中。 - user2485710
1
N3656已被采纳为C++14标准,并有独立的实现:http://isocpp.org/files/papers/N3656.txt - Arto Bendiken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接