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

时间:2018-06-26 14:32:52

标签: c++ c++11 inline destructor unique-ptr

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

执行此操作的一种方法是编写一个空的析构函数定义,但感觉很混乱,并且还会从静态分析器(在我的情况下为 clang-tidy )中收到警告,{{1 }}应该用于琐碎的析构函数。

要详细说明实际用例-目标是要具有类似于以下内容的东西:

MyClass.h

= default

一个class MyClassImpl; class MyClass { std::unique_ptr<MyClassImpl> m_impl; public: MyClass(); // and some other methods }; 到不完整的类型,该类型在标头中被向前声明,并且该定义仅在源文件中是已知的。

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

std::unique_pointer

实际的问题是,编译器生成的error: use of undefined type 'MyClassImpl' 的默认析构函数是内联的,因此它需要MyClass的完整类型信息。

可以通过为MyClassImpl添加一个空的析构函数来解决此问题(通过在标头中声明并在源文件中定义,因为在标头中进行定义将使其隐式内联,这将导致相同的错误)。 / p>

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

1 个答案:

答案 0 :(得分:10)

只需按照常规方法在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;