#include <iostream>

class SomeClass {
public:
	SomeClass()
	{
		std::cout << "SomeClass()" << std::endl;
	}
	SomeClass(const SomeClass& other)
	{
		std::cout << "SomeClass(const SomeClass& other)" << std::endl;
	}
	SomeClass(SomeClass&& other)
	{
		std::cout << "SomeClass(SomeClass&& other)" << std::endl;
	}
	SomeClass& operator=(const SomeClass& other)
	{
		std::cout << "SomeClass& operator=(const SomeClass& other)" << std::endl;
	}
	SomeClass& operator=(SomeClass&& other)
	{
		std::cout << "SomeClass& operator=(SomeClass&& other)" << std::endl;
	}
	~SomeClass()
	{
		std::cout << "~SomeClass()" << std::endl;
	}
};

int main()
{
	std::cout << "1" << std::endl;
	SomeClass c1; // default constructor
	std::cout << "2" << std::endl;
	SomeClass c2(c1); // copy constructor
	std::cout << "3" << std::endl;
	SomeClass c3 = c2; // default constructor and copy assignment operator or just copy constructor
	std::cout << "4" << std::endl;
	c1 = c2; // copy assignment operator
	std::cout << "5" << std::endl;
	SomeClass c4(std::move(c3)); // move constructor
	std::cout << "6" << std::endl;
	c4 = std::move(c1); // move assignment operator
	return 0;
}