Yes, it calls a function on an object not yet built, which is undefined. You cannot find it reliable. I would say that you also should not try to detect it. This is nothing that could happen by chance, compared, for example, with a function call on an already remote object. Trying to catch all the possible mistakes is almost impossible. The declared name is already visible in its initializer for other useful purposes. Consider this:
Type *t = (Type*)malloc(sizeof(*t));
This is a common idiom in C programming and that still works in C ++.
Personally, I like this Herb Sutter story about null links (which are also invalid). The bottom line is that do not try to protect against cases when the language is explicitly forbidden and, in particular, in their general case it is impossible to reliably diagnose. Over time, you will receive false protection, which becomes quite dangerous. Instead, learn your understanding of the language interface and design (avoid pointers to raw, ...), which reduces the chance of errors.
In C ++, as well as in C, many cases are not explicitly prohibited, but remain undefined. Partly because some things are quite difficult to diagnose efficiently and partially, because undefined behavior allows alternative development behavior for it, rather than completely ignoring it - which is often used by existing compilers.
In the example above, for example, any implementation can freely throw an exception. There are other situations similar to undefined behavior, which are much more difficult to diagnose for implementation: the presence of an object in another translation system, available before its creation, is such an example, which is known as the fiasco of the static initialization order.