【发布时间】:2018-09-05 14:26:48
【问题描述】:
我有一个具有固定大小的 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';
}
};
复制构造函数工作正常,但我将如何实现移动构造函数?
我知道我可以用 std::array 替换 c 样式的数组,但是如果没有它,还有什么办法吗?
PS:很多人建议我使用编译器生成的复制/移动构造函数……不幸的是,在真正的类中,我不能这样做,因为这个类有其他成员和其他构造函数……我只是想知道是否有办法移动固定大小的成员。我猜没有,移动构造函数将不得不复制字节。我想知道这是否是std::array 所做的......
【问题讨论】:
-
你会通过不实现一个来实现一个。使用
std::string或std::array并让编译器来做。 -
您的移动构造函数将与您的复制构造函数相同。没有聪明的方法可以“移动”一个固定大小的数组。但是您为什么不想使用
std::array?对我来说这似乎是个好主意。 -
这堂课没有什么可动的。你不需要它。
-
有什么理由不使用
std::string和零规则? -
这并没有解决问题,但如果目标是让类保存一个以 nul 结尾的 C 字符串,
set_name中的代码是错误的。如果s指向的字符串长于缓冲区大小,则对memcpy的调用会将字符从s复制到缓冲区中,直到达到限制。结果将是name中的文本不是以 nul 结尾的。
标签: c++ constructor c++17 move-constructor