Let's say I have this class:
class Test
{
public:
Test();
};
AFAIK, compiler provides default copy constructor and assignment operators, which assign every member of other instance to the current instance. Now I add move constructor and assignment:
class Test
{
public:
Test();
Test(Test&& other);
Test& operator=(Test&& other);
};
Does this class still contain compiler-generated copy constructor and assignment operators, or I need to implement them?
Edit. This is my test:
class Test
{
public:
Test(){}
Test(Test&& other){}
Test& operator=(Test&& other)
{
return *this;
}
int n;
char str[STR_SIZE];
};
int main()
{
Test t1;
t1.n = 2;
strcpy(t1.str, "12345");
Test t2(t1);
Test t3;
t3 = t1;
cout << t2.n << " " << t2.str << " " << t3.n << " " << t3.str << endl;
return 0;
}
Prints 2 12345 2 12345
. Compiler: VC++ 2010. According to this test, copy constructor and assignment are still here. Is this standard behavior, can I be sure that this will work on every C++ compiler?
From 12.8-7 Copying and moving class objects [class.copy]
From 12.8-18
According to this, since you have declared a move constructor and a move assignment operator, but no copy assignment operator, copy constructor or destructor, you do not get the implicitly generated copy constructor or assignment operator. The compiler gives you their declarations, but they are declared as
deleted
.Here is a simplified version of your example:
And the error produced by g++ 4.8.1
(emphasis mine)
According to section 12.8 Copying and moving class objects of the C++ Standard
So in your case and the copy constructor and the copy assignment operator are implicitly declared by the compiler but defined as deleted.