`noncopyable`与自定义析构函数

时间:2016-04-30 02:32:17

标签: c++ destructor move-semantics noncopyable

我需要一个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;
}

1 个答案:

答案 0 :(得分:1)

要使代码正常工作,class C必须是可移动的。当它没有声明的析构函数时,它会获得编译器生成的隐式移动构造函数(以及移动赋值运算符)。但是当它有一个声明的("自定义"在你的说法中)析构函数时,不再隐式提供移动构造函数(和移动赋值运算符)。这是为了您的安全:假设您需要一个显式的析构函数,您还需要显式的移动函数。

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