首页 > 解决方案 > 如何使默认析构函数非内联?

问题描述

如何强制编译器使类的默认析构函数非内联?

这样做的一种方法是编写一个空的析构函数定义,但它感觉很混乱,而且你会从静态分析器(在我的例子中是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++ 中的唯一方法吗?

标签: c++c++11inlinedestructorunique-ptr

解决方案


只需在 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;

推荐阅读