命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(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)



 
 
unique_ptr& operator=( unique_ptr&& r ) noexcept;
(1) (C++23 以来是 constexpr)
template< class U, class E >
unique_ptr& operator=( unique_ptr<U, E>&& r ) noexcept;
(2) (C++23 以来是 constexpr)
unique_ptr& operator=( std::nullptr_t ) noexcept;
(3) (C++23 以来是 constexpr)
unique_ptr& operator=( const unique_ptr& ) = delete;
(4)
1) 移动赋值运算符。将所有权从 r 转移到 *this,就好像调用了 reset(r.release()),然后将 get_deleter()std::forward<Deleter>(r.get_deleter()) 赋值。
此重载仅在 std::is_move_assignable<Deleter>::valuetrue 时参与重载解析。
如果 Deleter 不是引用类型,则如果以下情况,则行为未定义:
否则(Deleter 是引用类型),则如果以下情况,则行为未定义:
2) 转换赋值运算符。将所有权从 r 转移到 *this,就好像调用了 reset(r.release()),然后将 get_deleter()std::forward<E>(r.get_deleter()) 赋值。
对于主模板,此重载仅在以下情况下参与重载解析:
  • U 不是数组类型,
  • unique_ptr<U, E>::pointer 可以隐式转换为 pointer,并且
  • std::is_assignable<Deleter&, E&&>::valuetrue
对于数组特化(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
如果 E 不是引用类型,则如果从 E 类型的右值分配 get_deleter() 非法或会抛出异常,则行为未定义。
否则(E 是引用类型),则如果从 E 类型的左值分配 get_deleter() 非法或会抛出异常,则行为未定义。
3) 等效于调用 reset()
4) 复制赋值运算符被显式删除。

内容

[edit] 参数

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

[edit] 返回值

*this

[edit] 备注

作为一种仅移动类型,unique_ptr 的赋值运算符只接受右值参数(例如 std::make_unique 的结果或移动的 unique_ptr 变量)。

[edit] 示例

#include <iostream>
#include <memory>
 
struct Foo
{
    int id;
    Foo(int id) : id(id) { std::cout << "Foo " << id << '\n'; }
    ~Foo() { std::cout << "~Foo " << id << '\n'; }
};
 
int main() 
{
    std::unique_ptr<Foo> p1(std::make_unique<Foo>(1));
 
    {
        std::cout << "Creating new Foo...\n";
        std::unique_ptr<Foo> p2(std::make_unique<Foo>(2));
        // p1 = p2; // Error ! can't copy unique_ptr
        p1 = std::move(p2);
        std::cout << "About to leave inner block...\n";
 
        // Foo instance will continue to live, 
        // despite p2 going out of scope
    }
 
    std::cout << "About to leave program...\n";
}

输出

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

[edit] 缺陷报告

以下行为变更缺陷报告被追溯地应用于先前发布的 C++ 标准。

DR 应用于 发布的行为 正确的行为
LWG 2047 C++11 对于重载 (2)get_deleter() 被分配为
std::forward<Deleter>(r.get_deleter())
更正为
std::forward<E>(r.get_deleter())
LWG 2118 C++11 unique_ptr<T[]>::operator=
拒绝限定转换
接受
LWG 2228 C++11 转换赋值运算符没有限制 限制
LWG 2899 C++11 移动赋值运算符没有限制 限制