Явно определённый с пустым телом деструктор никогда не является тривиальным. Неявно определённый деструктор может быть тривиальным.
struct X {};
struct Y
{
~Y() {}
};
void fx()
{
goto L; // OK
X x;
L:
;
}
void fy()
{
goto L; // ошибка в соответствии с 6.7/3
Y y;
L:
;
}
Неявно объявленный деструктор может не иметь определения вообще или по правилам C++11 быть определённым как deleted. Явно определённый с пустым телом деструктор может быть ill-formed:
class B
{
~B();
};
struct X : B {}; // OK
struct Y : B
{
~Y() {} // ошибка: B::~B() не доступен
};
Иногда деструктор приходится определять в том месте, где для этого есть возможность.
// какая-то отдельная единица трансляции
#include <memory>
struct A; // определён в другой единице трансляции
struct X
{
X();
~X(); // определён в другой единице трансляции
std::unique_ptr<A> p;
};
struct Y
{
Y();
std::unique_ptr<A> p;
};
void f()
{
X x; // OK
Y y; // ошибка: деструктор класса Y неявно определяется прямо
// в этой единице трансляции, данное неявное определение
// некорректно, т.к. здесь A - incomplete
}
============================================================================================
// другая единица трансляции
#include <memory>
struct A; // определён в другой единице трансляции
struct X
{
X();
~X(); // определён в другой единице трансляции
std::unique_ptr<A> p;
};
struct Y
{
Y();
std::unique_ptr<A> p;
};
struct A {};
X::X() {}
X::~X() {}
Y::Y() {}
Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет!
МР>Деструктор по умолчанию и пустой деструктор
МР>МР>class X {
МР>public:
МР> ~X() {} // пустой деструктор
МР>};
МР>
МР>это одно и тоже? Или бывают ситуации, когда есть разница?
МР>Заранее благодарен!
Удалось найти разницу
вот так:
struct base
{
virtual ~base () throw () { }
};
struct derived: base
{
~derived () { } // Если эту строку закомментировать, то не ругается
};
int main (int, char**)
{
derived d;
}
Ругается так:
Line 8: error: looser throw specifier for 'virtual derived::~derived()'
compilation terminated due to -Wfatal-errors.
Привет!
Деструктор по умолчанию и пустой деструктор
class X {
public:
~X() {} // пустой деструктор
};
это одно и тоже? Или бывают ситуации, когда есть разница?
Заранее благодарен!