我知道,每当定义自定义复制构造函数或分配运算符时,在派生的类中定义了,那么这些方法调用基础类的相应方法是这些方法的责任。现在,我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种调用基类构造函数的方法。从这里
Derived(Derived&& d):Base(d) -->Form A
{}
Derived(Derived&& d):Base(std::move(d)) -->Form B
{}
现在哪种方法正确。从我的理解和帖子上的最后一个答案中,使用表格B的最后一个答案将是危险和不正确的,因为当派生的类构造函数被称为衍生的类构造函数时。最好打电话给forma。同样,在移动复制分配运算符中,最好将基础类分配运算符和基类调用。
Form A
不正确。它不会实施移动语义。关于Form B
版本," d
被Base(std::move(d))
无效"的说法不准确。准确的语句应为" d
的Base
零件(子对象)无效"。
此外,我建议您在调用基本构造函数之前将d
明确施放为基本类型。也就是说,Base(std::move(static_cast<Base&>(d)))
。如果Base
具有模板构造函数,则可以避免潜在的问题。例如,考虑Base
为std::function
时的情况。没有明确的演员,您最终将由于std::function
的构造函数(5)。