c – 通过解除引用复制std :: unique_ptr的值

前端之家收集整理的这篇文章主要介绍了c – 通过解除引用复制std :: unique_ptr的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我编写了以下代码,我尝试将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>’

除非我取消注释我尝试定义复制构造函数和=运算符的行.
这消除了编译器错误,但没有消除IntelliSense错误.无论错误列表中显示的IntelliSense错误如何,它都会编译.

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

解决方法

复制构造函数不会隐式生成,因为您有一个用户定义的构造函数,为什么复制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&C++相关文章