C++11 std的唯一性::唯一性

C++11 std的唯一性::唯一性,c++11,unique-ptr,C++11,Unique Ptr,我一直在研究std::unique_ptr s,但在某些方面对其语义感到困惑。从 但是,即使是强硬的,它也很可能是一个愚蠢的例子,考虑这样的代码。 std::unique_ptr<int> a(new int(10)); std::unique_ptr<int> b = std::unique_ptr<int>(a.get()); std::cout << *b << std::endl; *a = 5; std::cout <&

我一直在研究std::unique_ptr s,但在某些方面对其语义感到困惑。从

但是,即使是强硬的,它也很可能是一个愚蠢的例子,考虑这样的代码。

std::unique_ptr<int> a(new int(10));
std::unique_ptr<int> b = std::unique_ptr<int>(a.get());
std::cout << *b << std::endl;
*a = 5;
std::cout << *b;
std::unique_ptr a(新的int(10));
std::unique_ptr b=std::unique_ptr(a.get());

你的最后一句话是正确的。只要您像下面一行那样将原始指针与
a.get()
一起使用,您就已经放弃了
std::unique\u ptr
对您做出的所有承诺

std::unique_ptr<int> b = std::unique_ptr<int>(a.get());
当然,如果要在两个
std::unique_指针
实例之间移动所有权,通常只需在
std::move
中使用赋值或初始化。以下两行中的任何一行都应有效

std::unique_ptr<int> b(std::move(a));
std::unique_ptr<int> b = std::move(a);
在我的系统上,输出如下。观察第一行和最后一行是否匹配

0x1827010
(nil)
0x1827010

您需要使用std::unique\u ptr b=std::move(a)。您必须为
std::unique\u ptr
@ECrownofFire使用移动分配,修复,谢谢。。。我应该检查一下。我很难理解移动语义。据我所知,这条线将使b指向a指向的任何东西,并使a指向null,对吗?@bahti,粗略地说,是的。提供更多详细信息。您提供的链接非常有用,谢谢。但现在我想到了具有唯一ptr成员的类的复制构造函数。如果unique_ptr是指向派生类的基类指针,我们不能使用(new Base(*foo.uniqueptrmember)或this.uniqueptrmember=std::move(foo.uniqueptrmber),因为foo是常量。可能的解决方案是什么?
std::unique_ptr<int> b(std::move(a));
std::unique_ptr<int> b = std::move(a);
#include <stdio.h>
#include <memory>
#include <stdlib.h>


int main(){
    std::unique_ptr<int> a(new int(10));
    printf("%p\n", a.get());
    std::unique_ptr<int> b(std::move(a));
    printf("%p\n", a.get());
    printf("%p\n", b.get());
}
0x1827010
(nil)
0x1827010