I also added a type trait test to check whether the conversion operator is marked explicit.
this change has the advantage of being clearer imo as it is a conversion operator for conersions not a constructor.
and also it allows users to take the address of convesion operator which I don't know if someone might find that useful.
As a rule of thumb, if the type is less than or equal to the CPU
register width times two then you ought to pass it by value. This
will lead to more efficient code generation.