Обычные арифметические преобразования (как указано в § 5 стандарта ISO) определяют, что любые операнды для большинства или всех арифметических и двоичных операторов проходят целочисленное продвижение перед самой операцией.
Это означает, чточто оба uint16_t
операнда сначала переводятся в int
для вычисления побитового |
, а затем усекаются обратно до uint16_t
для хранения в r2
.
На самом деле это то, о чем идет предупреждение:неявное усечение int
до uint16_t
.
. Эти преобразования также определяют, что bool
всегда будет иметь значение 1 или 0, поэтому первое приведение бесполезно, но поскольку второй операнд будетбыть повышенным до int
, тогда также второй бросок бесполезен, вы можете пойти с
uint16_t r2 = flag.load() | 0xaaff;
и, возможно, заставить замолчать предупреждение, явно приведя к более узкому типу, что заставляет вас осознать тот факт, чтоэто происходит:
uint16_t r2 = static_cast<uint16_t>(flag.load() | 0xaaff);