Compiler optimizations most likely, it probably figures out that you are just making a default constructed X and doesn't actually bother calling the function.
The X(); instance created in fun() is constructed directly in a's place rather than in a temporary location.
This is why initialization at the point of declaration is sometimes more efficient than assignment.
I was thinking if it's sane to rely on such behaviour or not. As for me, I've decided, that if it ever becomes important, such tests should be added to automatic testing system, which check it + should do on several compilers. Anyway, I guess it would be a bad construct which relies.
The following is a bit offtopic, but related -- for the case, when you don't want some constructor to work, I dare posting: