C++拷贝构造函数:尝试引用已删除的函数

Eut*_*rpy 3 c++ copy-constructor shared-ptr

我有一个名为的类classA,如下所示:

class classA {
    private:        
        char* data; 
    public:
        classA(const classA&) = delete;
        ~classA();      
    };

~classA()
    {
        delete[] data;
    }
Run Code Online (Sandbox Code Playgroud)

在另一个类中,让我们调用它classB,作为成员,我有一个共享指针classA:

class classB
    {
    private:
        std::shared_ptr<classA> ptrA;
    public: 
        classB(std::shared_ptr<classA>);
    };

classB(std::shared_ptr<classA> sp) : ptrA(sp)
    {}
Run Code Online (Sandbox Code Playgroud)

这是我实例化我的方式classB:

classA ca;
classB cb(std::make_shared<classA>(ca));
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

试图引用已删除的功能

显然,我试图引用我定义的复制构造函数deleted(有一个原因,不应复制此类的对象).但我很困惑为什么复制构造函数被调用,因为我传递共享指针,以及如何避免这种情况.

kmd*_*eko 7

您正在调用复制构造函数来尝试创建共享指针.

std::make_shared<classA>(ca)
                         ^^ constructs the classA using these parameters
Run Code Online (Sandbox Code Playgroud)

您可以调用make_shared<classA>()以创建指向默认构造的共享指针classA.或者选择另一个构造函数.