Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;11有“使您共享”但没有“使您独一无二”`_C++_C++11 - Fatal编程技术网

C++ 为什么C++;11有“使您共享”但没有“使您独一无二”`

C++ 为什么C++;11有“使您共享”但没有“使您独一无二”`,c++,c++11,C++,C++11,可能重复: 为什么C++11有一个make_shared模板,而没有make_unique模板 这使得代码非常不一致 auto x = make_shared<string>("abc"); auto y = unique_ptr<string>(new string("abc")); auto x=make_shared(“abc”); 自动y=unique_ptr(新字符串(“abc”); 根据赫伯·萨特(Herb Sutter)的说法,这“部分是疏忽”。本文包含

可能重复:

为什么C++11有一个
make_shared
模板,而没有
make_unique
模板

这使得代码非常不一致

auto x = make_shared<string>("abc");
auto y = unique_ptr<string>(new string("abc"));
auto x=make_shared(“abc”);
自动y=unique_ptr(新字符串(“abc”);

根据赫伯·萨特(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)... ) );
}
模板
std::unique_ptr使_唯一(Args&&…Args)
{

return std::unique_ptr(新的T(std::forward)和重点已经改变。

可能是因为
unique
需要构造一个对象,他们认为最好明确地完成它。不是代码不一致,而是库。unique_ptr的复制构造函数是私有的。因此没有“返回值优化”。我的猜测是根据语言规范,此优化不是强制性的。@hyde谢谢。我更新了它,但新版本没有包含此答案中的示例实现(可以在注释中找到)和
make_unique
也将在C++14中提供,在相同的
内存中
头N3656采用C++14,具有独立的实现: