При использовании троичного оператора в инициализации списка, что вызывает неявное преобразование int
в unsigned int
(и аналогично для long long
), но не short
в unsigned short
(и аналогично для char
) .
В частности, я удивлен, что функция i32v2
компилируется нормально, а другие нет:
unsigned short f16(unsigned short x);
unsigned int f32(unsigned int x);
void i16(short value) {
unsigned short encoded{value}; // narrowing, makes sense
}
void i32(int value) {
unsigned int encoded{value}; // narrowing, makes sense
}
void i16v2(short value) {
unsigned short encoded{false ? value : f16(value)}; // narrowing, makes sense
}
void i32v2(int value) {
unsigned int encoded{false ? value : f32(value)}; // not narrowing, huh?
}
Полный пример здесь: https://godbolt.org/z/fVTcrr
Я предполагаю, что троичный оператор неявно преобразует int
в unsigned int
, но я не понимаю, почему он не может преобразовать short
в unsigned short
аналогичным образом.
Я ожидаю, если это было возможно для int
, тогда троичный оператор должен также быть в состоянии преобразовать любой другой тип signed
в unsigned
, когда это возможно:
Если тип назначения не подписан, результирующее значение является наименьшим значением без знака, равным исходному значению по модулю 2n, где n - количество битов, используемых для представления типа назначения.
(https://en.cppreference.com/w/cpp/language/implicit_conversion)
Может кто-нибудь объяснить это бех avior, и, если возможно, ссылаться на стандартную или соответствующую страницу cppreference?