我们应该从派生类

时间:2015-05-11 04:17:32

标签: c++ c++11

据我所知,无论何时在派生类中定义自定义复制构造函数或赋值运算符,这些方法都有责任调用基类的相应方法。现在我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种方法来调用基类构造函数。取自here

Derived(Derived&& d):Base(d) -->Form A
{}
Derived(Derived&& d):Base(std::move(d)) -->Form B
{}

现在哪种方法是正确的。根据我的理解和使用表单B的帖子的最后一个答案将是危险和不正确的,因为在调用派生类构造函数时对象将无效。但是在formA中调用基类复制构造函数。致电FormA会更好吗?类似地,在移动复制赋值运算符中调用基类赋值运算符然后调用基类也不是更好。

1 个答案:

答案 0 :(得分:3)

Form A不正确。它没有实现移动语义。对于版本Form B,“d无效Base(std::move(d))”的语句不准确。准确的陈述应该是“Base的{​​{1}}部分(子对象)无效”。

此外,我建议您在调用基础构造函数之前显式地将d强制转换为基类型。也就是d。如果Base(std::move(static_cast<Base&>(d)))具有模板构造函数,这可以避免潜在的问题。例如,考虑BaseBase时的情况。如果没有明确的强制转换,由于std::function的{​​{3}},您最终会得到无限递归。

相关问题