gpt4 book ai didi

c++ - 通过取消引用复制 std::unique_ptr 的值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:07 30 4
gpt4 key购买 nike

我写了下面的代码,我试图将 unique_ptr 对象的值复制到一个结构中。

#include <iostream>
#include <memory>
using namespace std;

struct S {
S(int X = 0, int Y = 0):x(X), y(Y){}

// S(const S&) {}
// S& operator=(const S&) { return *this; }

int x;
int y;
std::unique_ptr<S> ptr;
};

int main() {
S s;
s.ptr = std::unique_ptr<S>(new S(1, 4));
S p = *s.ptr; // Copy the pointer's value
return 0;
}

它在 Visual C++ 2012 中弹出错误:

IntelliSense: no suitable user-defined conversion from "S" to "S" exists
IntelliSense: no operator "=" matches these operands operand types are: std::unique_ptr> = std::unique_ptr>
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

除非我取消注释我试图定义复制构造函数和 =operator 的行。这消除了编译器错误,但没有消除 IntelliSense 错误。无论错误列表中是否显示 IntelliSense 错误,它都会编译。

那么,为什么它不能只使用默认函数并用它们编译呢?我是否以正确的方式复制值(value)?如果需要复制构造函数,应该如何定义?

最佳答案

复制构造函数不是隐式生成的,因为您有一个用户定义的构造函数,这就是为什么您尝试复制 S 失败的原因。

但是,unique_ptr 仍然不可复制,只能移动,因此您可以为 S 使用移动构造函数> :

S(S&& other) : x(other.x), y(other.y), ptr(std::move(other.ptr))
{

}

并称它为:

S p = std::move(s); // Move s to p

Live demo

关于c++ - 通过取消引用复制 std::unique_ptr 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573972/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com