【发布时间】:2018-12-05 07:49:27
【问题描述】:
如何强制编译器将类的默认析构函数设为非内联?
这样做的一种方法是编写一个空的析构函数定义,但感觉很混乱,而且你会从静态分析器(在我的例子中为 clang-tidy)收到警告,= default应该用于微不足道的析构函数。
要详细说明实际用例 - 目标是有类似的东西:
MyClass.h
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的完整类型信息。
这可以通过为MyClass 添加一个空的析构函数来解决(通过在头文件中声明并在源文件中定义,因为在头文件中定义将隐式使其内联,这将导致相同的错误)。
但这是现代 C++ 中唯一的方法吗?
【问题讨论】:
标签: c++ c++11 inline destructor unique-ptr