带有自定义析构函数的`noncopyable`
`noncopyable` with custom destructor
我需要一个 noncopyable
class,它有一个已声明的析构函数,天真的方法不起作用:请参阅 https://ideone.com/mU8aoc。析构函数有什么问题,为什么移动与没有析构函数的方式不同?当然,如何修复它?
供参考,完整代码(同上ideone
link):
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
必须是可移动的。当它没有声明的析构函数时,它会获得编译器生成的隐式移动构造函数(和移动赋值运算符)。但是当它有一个声明的("custom" 用你的说法)析构函数时,移动构造函数(和移动赋值运算符)不再隐式提供。这是为了您的安全:假定如果您需要显式析构函数,您也将需要显式移动函数。
参考:http://en.cppreference.com/w/cpp/language/move_constructor
我需要一个 noncopyable
class,它有一个已声明的析构函数,天真的方法不起作用:请参阅 https://ideone.com/mU8aoc。析构函数有什么问题,为什么移动与没有析构函数的方式不同?当然,如何修复它?
供参考,完整代码(同上ideone
link):
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
必须是可移动的。当它没有声明的析构函数时,它会获得编译器生成的隐式移动构造函数(和移动赋值运算符)。但是当它有一个声明的("custom" 用你的说法)析构函数时,移动构造函数(和移动赋值运算符)不再隐式提供。这是为了您的安全:假定如果您需要显式析构函数,您也将需要显式移动函数。
参考:http://en.cppreference.com/w/cpp/language/move_constructor