Согласно стандарту ([class.dtor] / 1) вам разрешается использовать ключевое слово friend
при объявлении деструктора:
Каждый decl-спецификатор из decl-specier-seq декларации деструктора (если есть) должен быть friend
, inline
или virtual
.
(Примечание: в C ++ 20 вы также сможете объявлять деструкторы constexpr
.)
Однако вы не можете просто взять обычное объявление деструктора в своем классе и добавить friend
, например,
struct S {
friend ~S();
};
Это не работает, потому что (я полагаю, но не могу найти стандартную кавычку для резервного копирования прямо сейчас), когда вы объявляете функцию другом, компилятор ищет имя в содержащем пространстве имен и, если он не найдет его там, сделает функцию членом этого пространства имен.
Тем не менее, что-то вроде этого совершенно правильно:
struct S { ~S(); };
struct T {
// ...
friend S::~S(); // this is also a declaration of S's destructor
};
Это позволяет деструктору S
получать доступ к закрытым членам T
, как и следовало ожидать.