我需要一个具有声明的析构函数的noncopyable类,并且幼稚的方法不起作用:请参见https://ideone.com/mU8aoc。析构函数有什么问题,为什么移动不像没有它那样工作?当然,该如何解决?

作为参考,完整的代码(与上面的ideone链接相同):

class noncopyable {
public:
    noncopyable(noncopyable &&) noexcept;

    noncopyable &operator=(noncopyable &&) noexcept;

protected:
    noncopyable() = default;

    ~noncopyable() = default;

    noncopyable(const noncopyable &) = delete;

    noncopyable &operator=(const noncopyable &) = delete;
};

class C: noncopyable {
public:
    // compiles if this line is uncommented
    // C(C&& c);

    C() {}

    // also compiles if this is commented
    ~C() {}
};

C a() {
    return {};
}

C b() {
    return a();
}

int main() {
    return 0;
}

最佳答案

为了使代码正常工作,class C必须是可移动的。当它没有声明的析构函数时,它将获得编译器生成的隐式move构造函数(以及move赋值运算符)。但是,当它具有已声明的(按您的说法是“ custom”)析构函数时,将不再隐式提供move构造函数(和move赋值运算符)。这是出于安全考虑:假定如果需要显式析构函数,则也将需要显式move函数。

参考:http://en.cppreference.com/w/cpp/language/move_constructor

关于c++ - 具有自定义析构函数的“不可复制”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36950057/

10-13 08:29
查看更多