That's because list initialization and assignment initialization are not the same.
Code:
Number n(5); // -> construct n using Number(int) constructor
Number m = 5; // -> implicitly convert 5 to Number and initialize m with the resulting temporary
in other words, the second statement is interpreted as
Code:
Number m = Number(5);
but only after validation, of course; i.e. an explicit constructor is not allowed. Besides, the implicit conversion could also use a conversion operator, i.e.
Code:
Number m = someSpecialNumber;
could be interpreted as
Code:
Number m = someSpecialNumber.operator Number();