如何使默认析构函数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;
如何强制编译器生成 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;