C ++ - Переместить конструктор класса с фиксированным размером, член массива c-style - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть класс с фиксированным размером, член массива в стиле c, что-то вроде this :

struct some {
    static const size_t name_length = 64;

    char name[name_length+1];

    some() = default;

    some(const some& s) {
        memcpy(name, s.name, strlen(s.name)+1);
    }

    // other constructors...

    void set_name(const char* s) {
        auto len = strlen(s);
        if (len > name_length) {
            len = name_length;
        }
        memcpy(name, s, len);
        name[len] = '\0';
    }
};

Конструктор копирования работает нормально, но как мне реализовать конструктор перемещения?

Я знаю, что мог бы заменить массив c-style на std::array, но есть ли способ сделать это без него?

PS: многие люди предлагают мне использовать сгенерированные компилятором конструкторы копирования / перемещения ... К сожалению, в реальном классе я не могу этого сделать, потому что у этого класса есть другие члены и другие конструкторы ... Я просто хотел узнать, есть ли способ перемещения элементов фиксированного размера. Я думаю, что нет, и конструктор перемещения должен будет просто скопировать байты. Интересно, это то, что std::array делает ...

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Поскольку ваш класс не владеет никаким ресурсом ни напрямую (ни косвенно через участника), не тратьте свое время на написание Move-Ctor и / или Move-Assignment, здесь нет никаких преимуществ:
В любом случае они должны делать то же, что и варианты копирования.

Кроме того, написание собственного пользовательского copy-ctor - пустая трата времени, так как по умолчанию он вполне подходит и имеет недостаток, заключающийся в том, чтобы сделать класс нетривиальным. Хотя, если вам нужно быть демонстративным, явно по умолчанию его в классе, чтобы сохранить тривиальность.

Кроме того, подумайте, нужно ли вам вообще 0-окончание или вы можете вместо этого использовать 0-дополненные последовательности максимальной длины. Просто один больше, чем степень двух, довольно неудобный размер.

0 голосов
/ 05 сентября 2018

как мне реализовать конструктор перемещения?

Нет ресурсов, которыми владеет этот класс, нет членов-указателей, поэтому его конструктор перемещения идентичен конструктору копирования.

Кроме того, вам не нужно определять конструктор копирования здесь вручную, сгенерированный компилятором, делает правильную вещь - пошаговое копирование:

some(const some& s) = default;

Кроме того, вы можете удалить оба конструктора. Это также позволит вам инициализировать ваш класс с помощью синтаксиса агрегатного инициализатора, например: some s = {"it is something"};.

...