C ++-使用固定大小的c样式数组成员移动类的构造函数

时间:2018-09-05 14:26:49

标签: c++ constructor c++17 move-constructor

我有一个具有固定大小的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';
    }
};

Copy构造函数工作正常,但是我将如何实现move构造函数?

我知道我可以用std::array替换c样式的数组,但是如果没有它,还是可以这样做吗?

PS:很多人建议我使用编译器生成的复制/移动构造函数...不幸的是,在实际的类中,我无法做到这一点,因为此类具有其他成员和其他构造函数...我只是想知道是否有一种方法来移动固定大小的成员。我猜没有,移动构造函数将只需要复制字节。我不知道这是std::array的作用吗……

2 个答案:

答案 0 :(得分:3)

由于您的班级没有直接拥有任何资源(也不是通过成员间接拥有任何资源),所以不要浪费时间编写move-ctor和/或move-assignment,因此没有任何好处:
无论如何,它们必须执行与复制变体相同的操作。

此外,编写您自己的自定义copy-ctor是浪费时间,因为默认值是完美的,并且具有使类变得不平凡的缺点。尽管如果您要进行演示,则可以在班级中明确将其默认设置以保持琐碎性。

顺便说一句,考虑您是否根本需要0终止,还是可以使用最大长度的0填充序列。仅仅比2的幂大一点,这是一个尴尬的大小。

答案 1 :(得分:1)

  

我将如何实现move构造函数?

该类没有资源,没有指针成员,因此其move构造函数与其副本构造函数相同。

此外,您无需在此处手动定义副本构造函数,编译器生成的副本构造函数可以正确执行-成员级副本:

using (StreamWriter sw = new StreamWriter(fileName, true, new UTF8Encoding(false), BufferSize))

或者,您可以删除两个构造函数。这也将允许您使用诸如some(const some& s) = default; 之类的聚合初始化器语法来初始化您的类。