C++: Хроники Дурки🚑
Я в очередной раз искал медь, а нашел золото.
Я чуть-чуть погрузился в bit_cast. Ввели такой в С++20 каст побитовый.
Он передает бит к биту из одного объекта в другой.
Условия просты:
```
sizeof(To) == sizeof(From) is true;
is_trivially_copyable_v<To> is true; and
is_trivially_copyable_v<From> is true.
```
И я искал воспроизводящий пример как он ведет себя с padding byte и ломается ли у нас что-то (если у вас такой есть - несите в предложку).
Но наткнулся на вот такой веселый пример.
struct alignas(int) Empty {};
static_assert(sizeof(Empty) == sizeof(int));
int main() {
const int x = std::bit_cast<int>(Empty{});
std::printf("%d %d", x == 0, x != 0);
}
И у нас clang весело выводит
0 0
x и равен нулю, и неравен нулю (оба сравнения false).
И если вы думаете, что на этом все закончено, то нет. Если убрать флаг -O2 из флагов компиляции, вывод будет
0 1
А в gcc вывод с O2 и без O2 выглядят так
1 0
0 1
Кароче, bit_cast временно вычеркиваю из инструментов до дальнейшего разбирательства.
27 · 718 ·