如何使默认析构函数non-inline?

How to make the default destructor non-inline?

如何强制编译器生成 class non-inline 的默认析构函数?

这样做的一种方法是编写一个空的析构函数定义,但感觉很乱,而且您还会收到静态分析器的警告(clang-tidy 在我的例),= default 应该用于平凡的析构函数。

详细说明实际用例 - 目标是拥有类似于:

MyClass.h

class MyClassImpl;

class MyClass {
    std::unique_ptr<MyClassImpl> m_impl;
public:
    MyClass();
    // and some other methods
};

A std::unique_pointer 到一个不完整的类型,它在 header 中向前声明并且定义仅在源文件中已知。

以上代码会出现编译错误:

error: use of undefined type 'MyClassImpl'

实际问题是,编译器生成的 MyClass 默认析构函数是内联的,因此需要 MyClassImpl.

的完整类型信息

这可以通过为 MyClass 添加一个空的析构函数来解决(通过在 header 中声明并在源文件中定义,因为在 header 中定义将隐含地使它内联会导致同样的错误)。

但这是现代 C++ 中的唯一方法吗?

按照普通方法在cpp文件中实现即可:

MyClass.h

class MyClassImpl;

class MyClass {
    std::unique_ptr<MyClassImpl> m_impl;
public:
    MyClass();
    ~MyClass() /*noexcept*/;

    // and some other methods
};

在 cpp 中

MyClass::~MyClass() /*noexcept*/ = default;