我需要一个具有声明析构函数的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;
}发布于 2016-04-30 02:49:06
要使代码工作,class C必须是可移动的。当它没有声明的析构函数时,它将得到一个编译器生成的隐式移动构造函数(以及移动赋值操作符)。但是当它有一个声明的(用你的话说是“自定义”)析构函数时,移动构造函数(和移动赋值操作符)就不再隐式地提供了。这是为了您的安全:假设如果您需要一个显式析构函数,您也需要显式移动函数。
参考资料:constructor
https://stackoverflow.com/questions/36950057
复制相似问题