考虑以下代码:
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 ++中是否有某些情况(例如上面的示例)必须明确定义移动构造函数或移动分配?它们实际上是由构造函数隐式定义的吗?谢谢