C++ - 移动 class 的具有固定大小的 c 样式数组成员的构造函数

C++ - Move constructor of class with a fixed size, c-style array member

我有一个固定大小的 class,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] = '[=11=]';
    }
};

复制构造函数工作正常,但是我如何实现移动构造函数?

我知道我可以用 std::array 替换 c 风格的数组,但是如果没有它,有没有办法做到这一点?

P.S.: 很多人建议我使用编译器生成的 copy/move 构造函数...不幸的是,在真正的 class 中,我不能那样做因为这个 class 有其他成员和其他构造函数......我只是想知道是否有办法移动固定大小的成员。我想没有,移动构造函数将不得不只复制字节。我想知道这是否是 std::array 所做的...

how would I implement a move constructor?

这个 class 没有资源,没有指针成员,所以它的移动构造函数和它的复制构造函数是相同的。

此外,您不需要在这里手动定义复制构造函数,编译器生成的复制构造函数会做正确的事 - 成员智能复制:

some(const some& s) = default;

或者,您可以删除两个构造函数。这也将允许您使用聚合初始化语法初始化 class,例如:some s = {"it is something"};.

由于您的 class 不直接拥有任何资源(也不通过成员间接拥有),请不要浪费时间编写 move-ctor 和/或 move-assignment,这不会获得任何优势:
无论如何,他们必须做与复制变体相同的事情。

此外,编写您自己的自定义复制函数是在浪费时间,因为默认复制函数非常好,而且缺点是 class 变得很复杂。尽管如果你必须要说明,请在-class中明确默认它以保持琐碎。

顺便说一句,请考虑您是否完全需要 0 终止,或者可以使用最大长度的 0 填充序列代替。只比二的幂多一个是相当尴尬的大小。