When I accidentally pass a signed integer to the three-parameter constructor of decimal32_t I get a wall of errors, including the enable_if things. The programmer's experience would be better if instead such constructor was declared and allowed but had a static_assert inside, where the message would clearly say: you have to use an unsigned integer when you explicitly provide the sign.