我有一个具有固定大小的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
的作用吗……
答案 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;
之类的聚合初始化器语法来初始化您的类。