Order of parameters in outer constructor matters?

The crux of the issue, as far as I get, is that Bar{N} is just an alias for Bar{N, K} where {K}.

So, effectively, Julia parses the function definition as

julia> struct Bar{T<:Integer, N}
           val::T
       end

julia> function (Bar{N, P} where {P})() where {N}
           return Bar{Int, N}(1)
       end

This is why you can’t call Bar{2} at all if the first type parameter of Bar is constrained to a subtype of Integer.