5.2.4 Pseudo destructor call [expr.pseudo]
1 The use of a pseudo-destructor-name after a dot . or arrow -> operator represents the destructor for the
non-class type named by type-name. The result shall only be used as the operand for the function call operator
(), and the result of such a call has type void. The only effect is the evaluation of the postfixexpression
before the dot or arrow.
2 The left hand side of the dot operator shall be of scalar type. The left hand side of the arrow operator shall
be of pointer to scalar type. This scalar type is the object type. The type designated by the pseudodestructor-
name shall be the same as the object type. Furthermore, the two type-names in a pseudodestructor-
name of the form
::opt nested-name-specifieropt type-name :: ˜ type-name
shall designate the same scalar type. The cv-unqualified versions of the object type and of the type designated
by the pseudo-destructor-name shall be the same type.