8 Expressions [expr]

8.2 Postfix expressions [expr.post]

8.2.4 Pseudo destructor call [expr.pseudo]

The use of a pseudo-destructor-name after a dot . or arrow -> operator represents the destructor for the non-class type denoted by type-name or decltype-specifier.
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 postfix-expression before the dot or arrow.
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 cv-unqualified versions of the object type and of the type designated by the pseudo-destructor-name shall be the same type.
Furthermore, the two type-names in a pseudo-destructor-name of the form
nested-name-specifier type-name ::~ type-name
shall designate the same scalar type (ignoring cv-qualification).