template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept;(6)
我发现unique_ptr<T[],D>有许多构造函数。但是我不知道如何创建一个unique_ptr<T[],D>与函数(6)你能告诉我怎么叫吗?谢谢。
参考:https://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr
unique_ptr
不能被复制,所以没有复制构造函数。构造函数5和6是move构造函数,它们将指针的所有权从原始对象中移除,并将其赋予新对象。
unique_ptr( unique_ptr&& u ) noexcept; // (5) (constexpr since C++23)
template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept; // (6) (constexpr since C++23)
例如,up6b
和up6d
正在使用对该函数的调用。
调用之后,智能指针up6a
和up6c
不再指向它们之前指向的对象。
std::cout << "Example constructor(6)...n";
{
std::unique_ptr<Foo, D> up6a(new Foo, d); // D is copied
std::unique_ptr<Foo, D> up6b(std::move(up6a)); // D is moved
std::unique_ptr<Foo, D&> up6c(new Foo, d); // D is a reference
std::unique_ptr<Foo, D> up6d(std::move(up6c)); // D is copied
}
在c++ 17之前最常见的move构造函数调用是用make_unique
进行初始化。您可以轻松地这样做:
std::unique_ptr<int[]> a(new int[10]);
std::unique_ptr<int[]> b(std::move(a));
但是如果你试图使用make_unique,后者需要调用特殊化来分配数组。
std::unique_ptr<int[]> b = std::make_unique<int[]>(10);
注意,没有必要调用上面提到的move构造函数。
您可以使用make_unique
,如下所示:
auto ptr = std::make_unique<int[]>(2);
或
如果你想传递一个自定义删除器,一种方法是使用std::function
,如下所示:
auto ptr = std::make_unique<int[]>(2);
//here we use lambda as a deleter
std::unique_ptr<int[], std::function<void(int[])>> PTR(new int[2](), [](int*p)->void
{
std::cout<<"lambda called"<<std::endl;
delete[]p ;
});
std::unique_ptr<int[], std::function<void(int[])>> P2(std::move(PTR));
//or more readable
//auto P2 = std::move(PTR);
工作演示。
使用单独的函数代替lambda
也是可能的,并且如下所示:
//use a free function as deleter
void func(int p[])
{
std::cout<<"func called"<<std::endl;
delete[]p ;
}
int main()
{
auto ptr = std::make_unique<int[]>(2);
std::unique_ptr<int[], std::function<void(int[])>> PTR(new int[2](), func);
std::unique_ptr<int[], std::function<void(int[])>> up6b(std::move(PTR));
//or more readable
//auto up6b = std::move(PTR);
}
演示