如何使默认析构函数非内联?

nVx*_*Vxx 1 c++ destructor inline unique-ptr c++11

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

这样做的一种方法是编写一个空的析构函数定义,但它感觉很乱,而且你从静态分析器得到一个警告(在我的情况下是clang-tidy),= default应该用于一个简单的析构函数.

要详细说明实际用例 - 目标是使用类似的东西:

MyClass.h

class MyClassImpl;

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

A std::unique_pointer到不完整类型,在标头中向前声明,定义仅在源文件中已知.

上面的代码会给出编译器错误:

error: use of undefined type 'MyClassImpl'
Run Code Online (Sandbox Code Playgroud)

实际问题是,MyClass编译器生成的默认析构函数是内联的,因此它需要完整的类型信息MyClassImpl.

这可以通过添加一个空的析构函数来修复MyClass(通过在头文件中声明并在源文件中定义,因为在头文件中定义将隐式地使其内联,这将导致相同的错误).

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

Jar*_*d42 11

只需在cpp文件中实现它作为普通方法:

MyClass.h

class MyClassImpl;

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

    // and some other methods
};
Run Code Online (Sandbox Code Playgroud)

在cpp

MyClass::~MyClass() /*noexcept*/ = default;
Run Code Online (Sandbox Code Playgroud)

  • 不知道 `default` 可以用于单独定义,很高兴知道。 (2认同)