The type name being declared can be used within a class declaration as long as the size of the class is not used. Exceptions are inline functions and default arguments.
Inline functions behave as if they were defined immediately after the class is declared. (For more information, see “Inline Member Functions”.) Default arguments are not evaluated until the point of the function call. Therefore, the size of the class is known before the inline function definition or default argument evaluation is processed.