Destructors are invoked automatically when control leaves the scope in which the object was created. Add an explicit destructor call to
that, and you end up with undefined behavior because the automatic destructor invocation will be invoked on an object that no longer exists. However
sometimes it is acceptable to have destructor calls for some specific use-cases, i.e. when it is desired to destroy the object but without releasing
the memory.
Noncompliant code example
MyClass mc;
//...
mc.~MyClass(); // Noncompliant