`不可复制`与自定义析构函数
`noncopyable` with custom destructor
我需要一个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
相关文章:
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 如何正确定义C++类析构函数并将其链接到主文件?
- 仅在 MacOS 上析构函数的未定义符号
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 对已定义的接口析构函数的未定义引用
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- DIRECTX9 中自定义顶点的虚拟析构函数
- 仅在删除包含对象的向量时调用自定义»析构函数«
- 这个递归类需要一个自定义析构函数?
- C++ - 定义自定义析构函数时程序崩溃
- 使用自定义析构函数时出现"Undefined reference"错误
- std::unique_ptr的自定义deleter是手动调用析构函数的有效位置吗
- `不可复制`与自定义析构函数
- 是否可以使用 std::shared_ptr 创建共享对象池,并在没有自定义析构函数的情况下创建weak_ptr
- 自定义字符串类和析构函数
- 使用自定义分配器调用对象构造函数/析构函数
- 定义自己的析构函数,尽管类派生自QObject
- 为什么只有在声明了自定义构造函数时,基类析构函数才能访问
- 带有Placement New的自定义析构函数