Я смущен, когда конструктор перемещения получает вызов против конструктора копирования. Я прочитал следующие источники:
Переместить конструктор не вызывается в С++ 0x
Переместить семантику и ссылки rvalue в С++ 11
Все эти источники либо слишком сложны (я просто хочу простой пример), либо только показать, как писать конструктор перемещения, но не как его называть. Я написал простую проблему, чтобы быть более конкретным:
const class noConstruct{}NoConstruct;
class a
{
private:
int *Array;
public:
a();
a(noConstruct);
a(const a&);
a& operator=(const a&);
a(a&&);
a& operator=(a&&);
~a();
};
a::a()
{
Array=new int[5]{1,2,3,4,5};
}
a::a(noConstruct Parameter)
{
Array=nullptr;
}
a::a(const a& Old): Array(Old.Array)
{
}
a& a::operator=(const a&Old)
{
delete[] Array;
Array=new int[5];
for (int i=0;i!=5;i++)
{
Array[i]=Old.Array[i];
}
return *this;
}
a::a(a&&Old)
{
Array=Old.Array;
Old.Array=nullptr;
}
a& a::operator=(a&&Old)
{
Array=Old.Array;
Old.Array=nullptr;
return *this;
}
a::~a()
{
delete[] Array;
}
int main()
{
a A(NoConstruct),B(NoConstruct),C;
A=C;
B=C;
}
в настоящее время A, B и C имеют разные значения указателя. Я бы хотел, чтобы у A был новый указатель, B имел старый указатель C, а C - нулевой указатель.
немного от темы, но если можно было бы предложить документацию, где я мог бы подробно узнать об этих новых функциях, я был бы благодарен и, вероятно, не нужно было бы задавать еще много вопросов.