【问题标题】:Should we be calling the base class move copy/assignment constructors from the derived class我们是否应该从派生类调用基类移动复制/赋值构造函数
【发布时间】:2015-05-11 04:17:32
【问题描述】:

我了解,只要在派生类中定义了自定义复制构造函数或赋值运算符,那么这些方法就有责任调用基类的相应方法。现在我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种调用基类构造函数的方法。取自here

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

现在哪种方法是正确的。根据我的理解和帖子上的最后一个答案,使用 Form B 将是危险和不正确的,因为在调用派生类构造函数时对象将被取消。但是在 formA 中调用了基类复制构造函数。打电话给 FormA 会更好。同样,在移动复制赋值运算符中,调用基类赋值运算符然后调用基类不是更好。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    Form A 不正确。它不实现移动语义。对于版本Form B,“dBase(std::move(d))无效”的说法是不准确的。准确的说法应该是“dBase部分(子对象)无效”。

    此外,我建议您在调用基本构造函数之前将d 显式转换为基本类型。即Base(std::move(static_cast<Base&>(d)))。如果Base 有模板构造函数,这可以避免潜在的问题。例如,考虑Basestd::function 的情况。如果没有显式强制转换,由于constructor (5)std::function,您最终会出现无限递归。

    【讨论】:

    • 如果要使用static_cast,使用std::move 有点多余。只要Base(std::static_cast<Base&&>(d)) 就可以了。
    • @SiyuanRen static_cast 然后move 的意图似乎更清楚。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2011-05-03
    • 2018-07-21
    • 2019-08-07
    • 2015-08-18
    相关资源
    最近更新 更多