Я пишу свой собственный векторный класс (контейнер для значений x, y), и я не совсем уверен, какие конструкторы / операторы присваивания я должен реализовать самостоятельно и что я могу рассчитывать на компилятор. Очевидно, мне нужно написать любой метод, который не имеет поведения по умолчанию или не генерируется автоматически в любом случае. Но, конечно же, нет смысла что-то реализовывать, если компилятор может генерировать точно такую же вещь.
Я использую Visual Studio 2010 (что может иметь значение в аспекте C ++ 11). Также мой класс — шаблонный, если это имеет значение.
В настоящее время у меня есть:
template <typename T>
class Integral2
{
// ...
Integral2(void)
: x(0), y(0)
{}
Integral2(Integral2 && other)
: x(std::move(other.x)), y(std::move(other.y))
{}
Integral2(T _x, T _y)
: x(_x), y(_y)
{}
Integral2 & operator =(Integral2 const & other)
{
x = other.x;
y = other.y;
return *this;
}
Integral2 & operator =(Integral2 && other)
{
x = std::move(other.x);
y = std::move(other.y);
return *this;
}
// ...
};
Нужно ли копировать ctor / оператор присваивания, когда у меня есть оператор ctor / move?
В C ++ есть Правило трех в котором приведены рекомендации, для которых нужно определить конструкторы / операторы, исходя из того, что вам нужно. В C ++ 11 некоторые считают, что семантика перемещения выдвигает правило трех к стать правилом пяти. смотреть на эта тема для примера реализации. Я рекомендую вам ознакомиться с этими рекомендациями.
Других решений пока нет …