首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在move构造函数中调用std::move on unique_ptr时出现"error: use of deleted function“

在move构造函数中调用std::move on unique_ptr时出现"error: use of deleted function"的错误是由于unique_ptr的特性所导致的。unique_ptr是一种独占所有权的智能指针,它禁止了拷贝构造和拷贝赋值操作,只允许移动构造和移动赋值操作。

当我们在move构造函数中调用std::move on unique_ptr时,实际上是试图将unique_ptr的所有权从一个对象转移到另一个对象。然而,unique_ptr的移动构造函数被删除了,这意味着我们无法直接使用std::move来移动unique_ptr。

为了解决这个问题,我们可以使用std::unique_ptr的reset()函数来释放原始指针,并将其指向新的对象。示例代码如下:

代码语言:txt
复制
class MyClass {
public:
    std::unique_ptr<int> ptr;

    // Move构造函数
    MyClass(MyClass&& other) {
        ptr = std::move(other.ptr); // 调用reset()释放原始指针并移动所有权
    }
};

在上述示例中,我们在移动构造函数中使用了reset()函数来释放原始指针并移动所有权。这样就可以避免"error: use of deleted function"的错误。

需要注意的是,unique_ptr的移动构造函数被删除是为了确保资源的独占性,防止多个智能指针同时管理同一个资源。因此,在使用unique_ptr时,我们需要谨慎处理移动操作,确保资源的正确管理。

关于unique_ptr的更多信息,您可以参考腾讯云C++ SDK中unique_ptr的文档:https://cloud.tencent.com/document/product/876/41717

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

性能大杀器:c++中的copy elision

,将temp2值赋值给o2 在上一节中,我们提到过,可以通过使用移动构造的方式来避免拷贝,为了测试该功能,尝试在Obj类中新增一个移动构造函数: #include struct...,不禁奇怪,为什么在CreateObj2()函数中,创建的temp明明是一个左值,此处却调用的是移动构造即当做右值使用呢?...the function call’s return object 意思是当返回语句中的表达式是一个非volatile的命名对象,其类型与函数的返回类型相同时,编译器可以优化掉拷贝或移动操作,直接将自动对象构造到函数调用的返回对象中...这意味着,当函数返回一个自动对象时,编译器可以优化掉不必要的拷贝或移动操作,直接将自动对象构造到函数调用的返回对象中,以提高效率。这种优化在 C++ 标准中被明确规定,以支持更高效的代码生成。...int> p2 = p1; 上述代码将编译失败,错误提示如下: error: use of deleted function 'std::unique_ptr::unique_ptr

16810

现代C++之手写智能指针

ptr2{ptr1}; // error unique_ptr ptr2{std::move(ptr1)}; // ok unique_ptr函数中的参数类型 unique_ptr& 改成了 unique_ptr,在构造参数时直接生成新的智能指针,从而不再需要在函数体中构造临时对象。...析构函数,生成规则和C++98一样,在C++11中有点不同的是,析构函数默认是noexcept。 拷贝构造函数,用户自定义了移动操作会导致不生成默认的拷贝构造函数,其它和C++98的行为一致。...,而不是带参数的移动构造,再调用移动赋值 unique_ptr ptr4(std::move(new circle)); // ok 调用带模板的移动构造 } 调用与结果如上代码所示...针对第一点:例如:ptr2 = std::move(ptr1); 会先调用赋值函数,由编译器决定调用的是拷贝构造还是移动构造,造出一个新的临时对象出来,临时对象会在跳出作用域后被析构掉。

2.9K10
  • Chapter 3: Moving to Modern C++

    ok int sum3 = x+y+z; // ok 调用对象的无参构造函数时,使用括号初始化会被编译器错误识别为声明了一个函数,而花括号初始化则能正确匹配到无参构造函数的调用 Widget w1(...); // error Widget w2{}; // ok 花括号初始化与std::initializer_lists和构造函数重载解析的同时出现时容易造成错误调用 在调用构造函数的时候,只要不涉及到...::initializer_list参数,在使用花括号初始化时,编译器会强烈地偏向于调用使用std::initializer_list参数的重载构造函数 class Widget { public...std::initializer_list构造函数时,此时调用空的花括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在花括号中嵌套一个空的花括号进行初始化...Understand special member function generation 特殊成员函数是C++会自动生成的函数,C++98中有四个这样的函数:默认构造函数,析构函数,拷贝构造函数,拷贝赋值运算符

    1.8K60

    掌握C++中智能指针的综合指南:深入现代内存管理

    2.3.1、初始化 make_shared / reset通过构造函数、std::shared_ptr辅助函数和reset方法来初始化shared_ptr,代码如下:std::shared_ptrfunction(shared_ptr(new int),g());因为C++的函数参数的计算顺序在不同的编译器不同的约定下可能是不一样的,一般是从右到左,但也可能从左到右;所以...不允许复制,但可以通过函数返回给其他的unique_ptr,还可以通过std::move来转移到其他的unique_ptr,这样它本身就不再拥有原来指针的所有权了。...需要注意的是,获取自身智能指针的函数仅在shared_ptr的构造函数被调用之后才能使用,因为enable_shared_from_this内部的weak_ptr只有通过shared_ptr才能构造。...在使用wp前需要调用wp.expired()函数判断一下。因为wp还仍旧存在,虽然引用计数等于0,仍有某处“全局”性的存储块保存着这个计数信息。

    25400

    C++核心准则ES.56​:只在需要将一个对象显式移动到另外的作用域时使用std::move​

    通常情况下,遵循本文档中的准则(包括不要不必要地扩大变量作用域,编写带返回值的简短函数,返回局部变量等)可以帮助消除显式执行std::move的大部分需求。...在显式移动一个对象到另外的作用域时,显式移动是有必要的。...特别是: 1.将对象传递给一个“下沉”函数时(接管变量所有权的函数,译者注) 2.实现对象自身移动操作(移动构造函数,移动赋值运算符)和交换操作时 Example, bad(反面示例) void sink...sink(w); // Error: unique_ptr is carefully designed so that you cannot copy it } Notes(注意) std::move...Use std::forward instead. 标记对转交引用类型调用std::move的情况(T&&,这里T是模板参数)。

    95220

    什么是智能指针

    例如,赋值时,计数将加 1,而指针过期时,计数将减 1,。当减为 0 时才调用 delete。这是 shared_ptr 采用的策略。...,也就是不能放在等号的左边(函数的参数和返回值例外),这一定程度上避免了一些误操作导致指针所有权转移,然而 unique_str 依然有提供所有权转移的方法: std::move。...调用 move 后,原 unique_ptr 就会失效,再用其访问裸指针也会发生和 auto_ptr 相似的 crash,如下面示例代码, unique_ptr up(new int(5));...将 weak_ptr 传递给 shared_ptr 的构造函数,要是对象已被析构,则抛出 std::exception 异常。...for_each() } 其中 push_back 调用没有问题,因为它返回一个临时 unique_ptr,该 unique_ptr 被赋给 vp 中的一个 unique_ptr。

    63520

    c++11&14-智能指针专题

    但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。同样,在weak_ptr析构时也不会导致引用计数的减少,它只是一个静静地观察者。...原来,智能指针ptr_a中引用了ptr_b,同样ptr_b中也引用了ptr_a,在main函数退出前,ptr_a和ptr_b的引用计数均为2,退出main函数后,引用计数均变为1,也就是相互引用。...; ptr_a和ptr_b在main函数中退出前,引用计数均为1,也就是说,在TestA和TestB中对std::weak_ptr的相互引用,不会导致计数的增加。...在TestB析构函数中,调用std::shared_ptr tmp = m_TestA_Ptr.lock(),把std::weak_ptr类型转换成std::shared_ptr类型,然后对TestA对象进行调用...>(); 通过move()函数 //up也是一个std::unique_ptr指针 unique_ptr up1 = std::move(up); 1.3.2 unique_ptr不能被复制或者拷贝

    64640

    一篇文章详解React Native初始化和通信机制

    NativeToJsBridge构造函数 上面说了NativeBridge的3个关键属性和4个关键方法,接下来我们说下他的构造函数,接触过C++的开发者应该知道,C++中类的构造函数和类同名,如下是NativeToJsBridge...上面我们说了,在NativeToJsBridge的构造函数中jsExecutorFactory使用JsToNativeBridge实例m_delegate和jsQueue创建了m_executor(实际上生产环境下只用了...(第一次调用flush()时,flushedQueue_必为空,稍后在bindBridge()中才bind flushedQueue_) 2.以"__fbBatchedBridge"作为属性key去global...当我们在JS中通过NativeModule调用native方法时,模块ID和方法ID会被加入一个名为_queue的队列,等到native侧调用JS方法时,顺便把这个队列作为返回值返回给native侧。...在Native调用JS一节中我们知道了callFunctionReturnFlushedQueue这个函数用于Native call JS,并把JS中的queue返回给Native。

    13K89

    CC++开发基础——智能指针

    ,都需要在堆中申请一段内存,然后在函数的最后释放该内存。...但是当函数运行期间出现异常的时候,delete将不被执行,此时申请到的内存得不到释放,会发生内存泄露。智能指针由于是类对象,该类对象可以在析构的时候自动释放智能指针所指向的内存。...实例离开作用域时(代码执行到了函数末尾,或者函数抛出异常),就会在其析构函数中自动释放obj_two对象所占有的内存资源。...初始化方式一,在智能指针构造函数中new一个新对象。...std::move可以把一个智能指针所占有的资源转移给另一个智能指针。 shared_ptr包含一个显式的构造函数,可用于将右值unique_ptr转换为shared_ptr。

    48320

    智能指针探究

    当你使用std::move函数将一个unique_ptr对象转化为右值引用并将其传递给另一个unique_ptr对象来初始化时,就会调用这个构造函数 unique_ptr& operator=(unique_ptr...当你使用std::move函数将一个unique_ptr对象转化为右值引用并将其赋值给另一个unique_ptr对象来初始化时,就会调用这个运算符 第三行代码创建一个unique_ptr对象p1...这样p1的所有权转移给p2,p1变为空指针 三四行代码,不涉及构造赋值运算符,只涉及到移动构造函数 这时候肯定会说,那和auto_ptr也一样啊,但unique_ptr p2(std::move...当使用new操作符创建一个新的对象时,会为该对象分配内存,并调用其构造函数来初始化它。当不再需要这个对象时,应该使用delete操作符来删除它。...第二个参数是删除器类型,即 function。删除器是一个函数对象,用于在智能指针销毁时释放其所指向的资源 在这段代码中,删除器是一个 lambda 表达式。

    9210

    【翻译】C++14的新特性简介

    初始化表达式会在Lambda被创建时(而不是调用时)进行计算 int factory(int i) { return i * 10; } auto f = [x = factory(2)] { return...=] { *p = 5; }; // ERROR: std::unique_ptr cannot be copied // vs. auto task2 = [p = std::move(p)] { *...constraints on constexpr functions) 在C11中,常量表达式函数的函数体只能包含非常局限的语法,包括但不仅仅是:typedef, using, 和只能有一个return...假如我们用以下方法调用foo函数: foo(std::unique_ptr{new T{}}, function_that_throws(), std::unique_ptr{new T{}...}); 编译器可以以自由的顺序进行,如果编译器先调用了new T{},然后是function_that_throws(),再然后…由于在一开始对T的构造中我们在堆上分配了一块内存,然后我们抛出了异常,因此我们在这里会导致一块内存泄漏

    4.1K20
    领券