`不可复制`与自定义析构函数

`noncopyable` with custom destructor

本文关键字:析构函数 自定义 可复制      更新时间:2023-10-16

我需要一个noncopyable类,它有一个声明的析构函数,而naive方法不起作用:请参阅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必须是可移动的。当它没有声明的析构函数时,它会得到编译器生成的隐式移动构造函数(和移动赋值运算符)。但是,当它有一个声明的(用你的话说是"自定义")析构函数时,移动构造函数(和移动赋值运算符)就不再隐式提供了。这是为了你的安全:假设如果你需要一个显式析构函数,你也需要显式的移动函数。

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