微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

假设我们有 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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。