Какой оператор 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 некоторые считают, что семантика перемещения заставляет правило трех стать правилом пяти. Посмотрите на эту ветку для примера реализации. Я рекомендую вам ознакомиться с этими рекомендациями.

Другие вопросы по тегам