如何解决模板化的特殊成员函数和赋值运算符函数需要什么?
假设我们有 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 举报,一经查实,本站将立刻删除。