Span: use static assert to kill copy construction from an incompatible span type.
Span: use static assert to kill copy construction from an incompatible span type.

Copy construction between Span of compatible type is allowed to fulfil the use
case Span<T> -> Span<const T>. This is achieved by a templated copy constructor
like constructor.

In p0122, the overload is discarded from the constructor set if the ElementType
of the Span in input is not convertible into the ElementType of the Span being
constructed.

To discard function overload, SFINAE has to be used which polutes the documentation
and make the code harder to read and maintain.

Unlike p0122, our Span class doesn't exposes (yet) functions with default argument
or functions that convert container in input into span the only overload with the
a single parameter that we exposes are:
- template<size_t N> Span(ElementType (&element)[N])
- Span(const Span& other): <- generated by the compiler.

For both of this functions we expect exact match and their resolution should not
interfere with the constructor that converts from another type of Span.

As a result it is possible to rely solely on C++ default resolution rules as we
won't hit cases were constructors convert from another type (std::array, std
container, span) and raise an error with a static assert if the element type
can't be converted.

If another copy - conversion - constructor is added then SFINAE has to be
reintroduced.

kjbracey-arm/mbed,c1728p9/mbed-os,c1728p9/mbed-os,betzw/mbed-os,mbedmicro/mbed,kjbracey-arm/mbed,andcor02/mbed-os,betzw/mbed-os,c1728p9/mbed-os,betzw/mbed-os,mbedmicro/mbed,betzw/mbed-os,betzw/mbed-os,mbedmicro/mbed,c1728p9/mbed-os,andcor02/mbed-os,andcor02/mbed-os,mbedmicro/mbed,c1728p9/mbed-os,kjbracey-arm/mbed,c1728p9/mbed-os,betzw/mbed-os,andcor02/mbed-os,andcor02/mbed-os,andcor02/mbed-os,mbedmicro/mbed,kjbracey-arm/mbed