buf = reinterpret_cast<unsigned char*>(&f);
for (int i = 0; i < sizeof(f); ++i)
std::cout << buf[i];
}
Вроде как тут уб, потому что я кастую не к массиву чаров, а к одному чару, и потому обращение к последующим некорректно.
Но на cppreference есть такие моменты:
https://en.cppreference.com/w/cpp/language/object
For an object of type T, object representation is the sequence of sizeof(T) objects of type unsigned char (or, equivalently, std::byte) beginning at the same address as the T object.
https://en.cppreference.com/w/cpp/language/reinterpret_cast
Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true:
...
AliasedType is std::byte, (since C++17) char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.
То есть как будто всё валидно на самом деле.
Однако есть такой proposal:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1839r2.pdf
Если всё правильно, то что он хочет решать? В нём можно найти такой текст:
This has only recently become undefined behavior as of C++17, when [P0137R1] was accepted. This proposal
includes a change to how pointers work, notably that they point to objects, rather than just representing an
address, and it seems that the proposal neglected to add any provisions to allow access to the object representation
of an object.
Может код валиден в прошлых версиях, но просто в стандарт случайно посадили багу, которую он и хочет закрыть?
Почему тогда на cppreference инфа не согласуется с инфой в нём (и соответственно в стандарте)?
Кастовать к чару можно
> не к массиву чаров, а к одному чару, и потому обращение к последующим некорректно. Чёт вроде нет такого
все хорошо. вы по одному читаете байты представления объекта http://eel.is/c++draft/basic.lval#11.3
Я повторюсь, но тогда непонятно, зачем нужно предложение с исправлением()
Указатель на массив типа и указатель просто на тип - это один и тот же указатель, никакого UB тут нет, кроме того, указатель на char особый случай, он всегда разрешён, не UB.
Обсуждают сегодня