(T2) obj1 means exactly the same thing as T2(obj1) (or static_cast<T2>(obj1) in this case), but maybe it'll be easier to reason about this constructor-like syntax.

With the code as-is, there are two options:

construct T2 with an int, obtained by the user-defined conversion operator to int

construct T2 from T2 obtained by the user-defined conversion operator to T2

As per N4140:

If there is exactly one viable function that is a better function than
all other viable functions, then it is the one selected by overload
resolution; otherwise the call is ill-formed

Two implicit conversion sequences of the same form are
indistinguishable conversion sequences unless one of the following
rules applies:

User-defined conversion sequence U1 is a better conversion sequence than another user-defined conversion sequence U2 if they
contain the same user-defined conversion function or constructor or
they initialize the same class in an aggregate initialization and in
either case the second standard conversion sequence of U1 is better
than the second standard conversion sequence of U2.

Since this doesn't apply, neither conversion is better than the other.