Как заставить компилятор сделать деструктор класса по умолчанию не встроенным?
Один из способов сделать это - написать пустое определение деструктора, но оно выглядит грязным, а также вы получаете предупреждение от статического анализатора ( 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
к неполному типу, который заранее объявлен в заголовке, а определение известно только в исходном файле.
Приведенный выше код выдаст ошибку компилятора:
error: use of undefined type 'MyClassImpl'
Фактическая проблема заключается в том, что деструктор по умолчанию MyClass
, сгенерированный компилятором, является встроенным, и поэтому ему требуется полная информация о типе MyClassImpl
.
Это можно исправить, добавив пустой деструктор для MyClass
(путем объявления в заголовке и определения в исходном файле, поскольку определение в заголовке неявно сделает его встроенным, что приведет к той же ошибке).
Но разве это единственный путь в современном C ++?