模板化的特殊成员函数和赋值运算符函数需要什么?

问题描述

假设我们有 std unique_ptr

constexpr unique_ptr() noexcept;
constexpr unique_ptr( std::nullptr_t ) noexcept;
(1) 
explicit unique_ptr( pointer p ) noexcept;
(2) 
unique_ptr( pointer p,/* see below */ d1 ) noexcept;
(3) 
unique_ptr( pointer p,/* see below */ d2 ) noexcept;
(4) 
unique_ptr( unique_ptr&& u ) noexcept;
(5) 
template< class U,class E >
unique_ptr( unique_ptr<U,E>&& u ) noexcept; (6)

示例来自 cppreference.com 为什么我们需要案例 6 中的模板化构造函数

运算符函数也一样

unique_ptr& operator=( unique_ptr&& r ) noexcept;
(1) 
template< class U,class E >
unique_ptr& operator=( unique_ptr<U,E>&& r ) noexcept;
(2) 
unique_ptr& operator=( std::nullptr_t ) noexcept;
(3)

在上面,第二个功能。 我也看到过这个。有什么目的吗?

解决方法

这个构造函数:

template< class U,class E >
unique_ptr( unique_ptr<U,E>&& u ) noexcept;

允许从具有不同删除器的现有 unique_ptr 转移所有权。它要求通过调用新删除器的构造函数将“旧”删除器转换为“新”删除器。

这个移动赋值运算符的想法是一样的:

template< class U,class E >
unique_ptr& operator=( unique_ptr<U,E>&& r ) noexcept;

以上两种方法都不是应用程序代码中常用的。最好完全忘记它们的存在,除非您使用自定义删除器进行大量工作。

,

最常见的用例是将所有权从 std::unique_ptr<Derived> 传递给 std::unique_ptr<Base>