The word "narrowing" is a bit of a misnomer. int i = 1; float f = {i};
is narrowing, but so is float f = 1.0f; int i = {f};
!
Here is the exact definition of narrowing conversion from the C++14 standard:
A narrowing conversion is an implicit conversion
- from a floating-point type to an integer type, or
- from
long double
to double
or float
, or from double
to float
, except where the source is a constant expression and the actual value after conversion is within the range of values that can be represented (even if it cannot be represented exactly), or
- from an integer type or unscoped enumeration type to a floating-point type, except where the source is a constant expression and the actual value after conversion will fit into the target type and will produce the original value when converted back to the original type, or
- from an integer type or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except where the source is a constant expression whose value after integral promotions will fit into the target type.
I approach this by just thinking of it as an arbitrary technical term, not as any actual statement about the number of bits in the value or whatever.
In your question, int i(j);
works fine because narrowing conversion is permitted when using parentheses, but not when using curly braces.