c++ - 如何使默认析构函数非内联?
问题描述
如何强制编译器使类的默认析构函数非内联?
这样做的一种方法是编写一个空的析构函数定义,但它感觉很混乱,而且你会从静态分析器(在我的例子中是clang-tidy= default
)得到一个警告,它应该用于一个微不足道的析构函数。
为了详细说明实际用例 - 目标是有类似的东西:
我的类.h
class MyClassImpl;
class MyClass {
std::unique_ptr<MyClassImpl> m_impl;
public:
MyClass();
// and some other methods
};
Astd::unique_pointer
到不完整类型,它在标头中前向声明,并且定义仅在源文件中已知。
上面的代码将给出编译器错误:
error: use of undefined type 'MyClassImpl'
实际的问题是,MyClass
编译器生成的默认析构函数是内联的,所以它需要完整的MyClassImpl
.
这可以通过添加一个空的析构函数来解决MyClass
(通过在头文件中声明并在源文件中定义,因为在头文件中定义将隐式使其内联,这将导致相同的错误)。
但这是现代 C++ 中的唯一方法吗?
解决方案
只需在 cpp 文件中以普通方法实现它:
我的类.h
class MyClassImpl;
class MyClass {
std::unique_ptr<MyClassImpl> m_impl;
public:
MyClass();
~MyClass() /*noexcept*/;
// and some other methods
};
在 cpp
MyClass::~MyClass() /*noexcept*/ = default;
推荐阅读
- html - 如何在 bootstrap 4 中使用 Carousel 增加图像大小?
- java - 在 Quarkus 中异步保存数据
- objective-c - 使用 NSUserDefault 在多个进程之间共享数据
- javascript - 在 iOS <12 上无法以编程方式触发输入点击
- python - Django显示一个用视图创建的png
- css - Webcomponents css类在插槽中不可用
- android - 如何使此联系表格工作在手机上打开邮件客户端?
- dart - Angular Dart:我们如何将对象迭代到 html 中?
- php - AWS Translate Php sdk 缺少字段,但文档中没有请求
- ss - 尝试使用 JavaScript 自动化网站上的报告过程