鉴于一个类实际上是可 move 的,手动实现类的 move 构造函数和 move 赋值运算符很快就会变得乏味。
我想知道什么时候这样做实际上是一个沉重、沉重、过早的优化?
例如,如果一个类只有微不足道的 POD 数据或本身定义了 move 构造函数和 move 赋值运算符的成员,那么我猜编译器要么只是优化大量的垃圾(在POD),否则使用成员的 move 构造函数和 move 赋值运算符。
但这能保证吗?在什么情况下我应该期望明确需要实现 move 构造函数和 move 赋值运算符?
编辑:如下所述,Nicol Bolas 在 https://stackoverflow.com/a/9966105/6345 对他的回答的评论中提到,在 Visual Studio 11 Beta(及之前)没有 move 构造函数或 move 赋值运算符永远自动生成。引用:http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
最佳答案
如果您发现自己正在实现,任何一个:
- 析构函数
- 复制构造函数
- 复制作业
那么你应该问问自己是否需要实现 move 构造。如果您“= default”上述任何一项,您应该问自己是否还应该“= default” move 成员。
更重要的是,您应该记录和测试您的假设,例如:
static_assert(std::is_nothrow_default_constructible<A>::value, "");
static_assert(std::is_copy_constructible<A>::value, "");
static_assert(std::is_copy_assignable<A>::value, "");
static_assert(std::is_nothrow_move_constructible<A>::value, "");
static_assert(std::is_nothrow_move_assignable<A>::value, "");
static_assert(std::is_nothrow_destructible<A>::value, "");
关于c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9965461/