Какой оператор ctor/ присваивания должен иметь векторный класс?
Я пишу свой собственный векторный класс (контейнер для значений 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?
1 ответ
В C++ существует Правило трех, в котором содержатся рекомендации относительно того, какие конструкторы / операторы вы должны определить, исходя из того, в чем вы уверены, что вам нужны. В C++11 некоторые считают, что семантика перемещения заставляет правило трех стать правилом пяти. Посмотрите на эту ветку для примера реализации. Я рекомендую вам ознакомиться с этими рекомендациями.