Oh, sorry - special member function. Copy/move/relocate constructors and assignment operators, and destructor; the Seven. I'm not counting other constructors (not even the default constructor) as those don't maintain invariants (though they may establish them) - a class without any of the seven SMFs can't claim to maintain any invariants, so std::decompose should be safe on it. The rules would be that when calling std::decompose on a prvalue of class type:
* if the class has any non-empty potentially overlapping direct subobjects (i.e., virtual bases or anonymous union members, but not EBO bases and [[no_unique_address]] members), then std::decompose is ill-formed
* otherwise, if it has any user-declared (not declared as defaulted) SMFs, or if it has any private direct subobjects, then std::decompose can only be called by members of the class and its friends
* otherwise, if it has any protected direct subobjects, std::decompose can only be called by members of the class, its friends, and its derived classes
* otherwise, std::decompose can be called from anywhere