Design of outer constructors

in StaticArrays

@generated function (::Type{SArray{S, T, N}})(x::Tuple) where {S <: Tuple, T, N}
    return quote
        SArray{S, T, N, $(tuple_prod(S))}(x)

I see the use of generated function for outer constructors.

what is the difference (and disadvantage) using the following instead?

SArray{S, T, N}(x::Tuple) where {S<:Tuple, T, N} = 
    SArray{S, T, N, tuple_prod(S) }(x)

on the other hand, in here:

@inline (::Type{SDiagonal{N,T}})(a::Tuple) where {N,T} = Diagonal(SVector{N,T}(a))

why don’t we define the following?

@inline SDiagonal{N,T}(a::Tuple) where {N,T} = Diagonal(SVector{N,T}(a))


maybe I know the answer of the first case: using generated function could push the computation of tuple_prod(s) into compilation time.

what about the second case? why use

(::Type{T})(x) = ...

instead of

T(x) = ...