std::unique_ptr<T,Deleter>::operator=

来自cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
动态内存管理
智能指针
(C++11)
(C++11)
(C++11)
(C++17 前)
(C++11)
(C++23)
分配器
内存资源
未初始化存储
未初始化内存算法
受约束的未初始化内存算法
垃圾收集支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
杂项
(C++20)
(C++11)
(C++11)
C 库
低层内存管理
 
 
主模板 unique_ptr<T> 的成员
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)
数组特化 unique_ptr<T[]> 的成员
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)
1) 移动赋值运算符。从 r 转移所有权到 *this ,如同以调用 reset(r.release()) 后随从 get_deleter()std::forward<Deleter>(r.get_deleter()) 的赋值。

Deleter 不是引用类型,则要求它为不抛出可移动赋值 (MoveAssignable)
Deleter 是引用类型,则要求 std::remove_reference<Deleter>::type 为不抛出可复制赋值 (CopyAssignable)

移动赋值运算符仅若 std::is_move_assignable<Deleter>::valuetrue 才参与重载决议。
2) 转换赋值运算符。行为同 (1) ,除了
  • 主模板的此赋值运算符仅若 U 非数组类型且 unique_ptr<U,E>::pointer 可隐式转换为 pointerstd::is_assignable<Deleter&, E&&>::valuetrue 才参与重载决议。
  • 数组特化 std::unique_ptr<T[]> 的此赋值运算符的表现与主模板中的相同,除了仅若下列皆为真才参与重载决议:
  • U 是数组类型
  • pointerelement_type* 是同一类型
  • unique_ptr<U,E>::pointerunique_ptr<U,E>::element_type* 是同一类型
  • unique_ptr<U,E>::element_type(*)[] 可转换为 element_type(*)[]
  • std::is_assignable<Deleter&, E&&>::valuetrue
3) 与调用 reset() 等效。

注意 unique_ptr 的赋值运算符只接受典型地由 std::move 生成的右值。( unique_ptr 类显式删除其左值复制构造函数和左值赋值运算符。)

参数

r - 所有权将被转移的智能指针

返回值

*this

示例

#include <iostream>
#include <memory>
 
struct Foo {
    Foo() { std::cout << "Foo\n"; }
    ~Foo() { std::cout << "~Foo\n"; }
};
 
int main() 
{
    std::unique_ptr<Foo> p1;
 
    {
        std::cout << "Creating new Foo...\n";
        std::unique_ptr<Foo> p2( std::make_unique<Foo>() );
        // p1 = p2; // 错误!不能复制 unique_ptr
        p1 = std::move(p2);
        std::cout << "About to leave inner block...\n";
 
        // Foo 实例将继续生存,尽管 p2 离开作用域
    }
 
    std::cout << "About to leave program...\n";
}

输出:

Creating new Foo...
Foo
About to leave inner block...
About to leave program...
~Foo

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 2118 C++11 unique_ptr<T[]>::operator= 拒绝限定转换 接受
LWG 2228 C++11 转换赋值运算符未受约束 已约束
LWG 2899 C++11 移动赋值运算符未受约束 已约束