class A{ A obj; } ;
is a recursive bomb because size A based on A Obviously this is not possible. A does not know how big A and never will be. This is easy to catch at compile time.
class A{ A(){ A* a = new A() ; } } ;
It is still a recursive bomb, but it will explode at run time, making it a logical mistake, not a syntax error. The compiler may issue a warning.
The secret here is that the functions defined in the class through the magic of the built-in functions ( [dcl.fct.spec] point 3, but apparently this is point 4 under [dcl.inline] in later drafts of the standard) and compiled after the class is defined, when it is used in other code (or none at all, as the MM indicates below if the function is never used).
Since the function will be moved outside the class definition before compiling it, the size A is known at the time the function is compiled, so it can be built safely.
As for A* a , this is just a pointer. The size is baked directly and has no special requirements.
source share