如何强制编译器使类的默认析构函数非内联?
执行此操作的一种方法是编写一个空的析构函数定义,但感觉很混乱,并且还会从静态分析器(在我的情况下为 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 ++的唯一方法吗?
答案 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;