Предупреждение / ошибка, которую вы видите, состоит в том, что второй и третий операнды троичного оператора имеют другой тип, приводящий к преобразованию.
Второй операнд out + (m / 2)
имеет тип size_t
, потому что это тип m
, который выполняет остальную часть выражения. Третий операнд -1
имеет тип int
. Поскольку оператор ?:
может приводить только к одному типу, тогда как обычные арифметические преобразования c применяются к обоим для определения типа.
Поскольку size_t
, который является беззнаковым, по меньшей мере равен int
, третий операнд преобразуется в size_t
. Это означает, что значение -1
преобразуется в значение без знака, результатом которого будет очень большое положительное число (скорее всего, 2 64 - 1).
Причина, по которой вы не эта ошибка появляется, когда третий операнд равен 1
, потому что преобразование значения int
1
в size_t
не изменит его значение, поскольку оно находится в диапазоне size_t
, тогда как -1
is not.
Вы можете предотвратить это преобразование, приведя m
к int
. В результате второй операнд будет иметь тип int
, поэтому третий операнд не будет преобразован.
return (out != -1) ? out + ((int)m / 2) : -1;