GCC прямо здесь или это ошибка?
Поскольку поведение не соответствует ожиданиям, я бы назвал это ошибкой.
С https://godbolt.org/z/aSj--7, кажется, что в глазах GCC data |= uint16_t(std::round(3.14f))
переводится как
(void) (data = TARGET_EXPR <D.2364, (uint16_t) round (3.1400001049041748046875e+0)>;, data | NON_LVALUE_EXPR <D.2364>;)
(TARGET_EXPR
представляет временный объект. D.2364
- имя внутренней переменной.)
Переведите внутренний язык GCC обратно на C ++, и мы получим
data = (temp = (uint16_t) round (3.14e+0), data | temp)
Поскольку LHS выражения с запятой не влияет на RHS, это должно быть так же безопасно, как и data = data | temp
. Тем не менее, GCC предупреждает в первом, но не во втором, что вряд ли будет преднамеренным Таким образом, я считаю, что это недосмотр сопровождающих GCC.