了解隐式定义的复制和移动构造函数C ++ 11

时间:2018-11-30 10:19:02

标签: c++ c++11 copy-constructor move-semantics

考虑以下代码:

class Shape
{
public:
    virtual void introduceMe() = 0;
};

class Triangle : public Shape
{
public:
    void introduceMe() override { std::cout << " I am a triangle \n"; }
};

此外,请考虑以下我的智能指针:

template<typename T>
class MyUnique_ptr
{
    T* ptr;

public:

    explicit MyUnique_ptr(T* p = nullptr)
    {
        ptr = p;
    }

    ~MyUnique_ptr()
    {
        delete ptr;
    }
}

此外,请考虑以下补充代码:

MyUnique_ptr<Shape> make_triangle()
{
    MyUnique_ptr<Shape> x(new Triangle);
    return x;  //a- getting an error: implicit defined copy constructor is a deleted function. (But works if I implement a copy constructor)
}

struct Color {
    float g;
};

Color test() {
    Color c;
    return c; //b- why this work whereas a) does not ?
}

最后,这是我的主要表情:

int main(int argc, char** argv)
{
   MyUnique_ptr<Shape> a(new Triangle);
   MyUnique_ptr<Shape> b(make_triangle());  // c- same error here. But works if I implement a move constructor and no copy constructor, why?  
   MyUnique_ptr<Shape> c(a); // d- same error here. But works if copy constructor is explicitly defined.
}

要继续:在a)c)和d)中的1-我遇到了错误,说隐式定义的副本构造函数是一个已删除的函数。为什么将其删除?如果我实现了一个复制构造函数,那么一切都会正常进行。为什么编译器强迫我提供副本构造函数?

2-如果我实现了move构造函数(没有复制构造函数),则a)和c)行将起作用。为什么编译器强迫我定义移动语义(构造函数)?在c ++中是否有某些情况(例如上面的示例)必须明确定义移动构造函数或移动分配?它们实际上是由构造函数隐式定义的吗?谢谢

0 个答案:

没有答案