我们是否应该从派生类调用基类移动复制/分配构造函数



我知道,每当定义自定义复制构造函数或分配运算符时,在派生的类中定义了,那么这些方法调用基础类的相应方法是这些方法的责任。现在,我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种调用基类构造函数的方法。从这里

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

现在哪种方法正确。从我的理解和帖子上的最后一个答案中,使用表格B的最后一个答案将是危险和不正确的,因为当派生的类构造函数被称为衍生的类构造函数时。最好打电话给forma。同样,在移动复制分配运算符中,最好将基础类分配运算符和基类调用。

Form A不正确。它不会实施移动语义。关于Form B版本," dBase(std::move(d))无效"的说法不准确。准确的语句应为" dBase零件(子对象)无效"。

此外,我建议您在调用基本构造函数之前将d明确施放为基本类型。也就是说,Base(std::move(static_cast<Base&>(d)))。如果Base具有模板构造函数,则可以避免潜在的问题。例如,考虑Basestd::function时的情况。没有明确的演员,您最终将由于std::function的构造函数(5)。

最新更新