170 похожих чатов

Привет. Есть вот такой код. void foo(float f) { auto*

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 инфа не согласуется с инфой в нём (и соответственно в стандарте)?

5 ответов

5 просмотров

Кастовать к чару можно

> не к массиву чаров, а к одному чару, и потому обращение к последующим некорректно. Чёт вроде нет такого

все хорошо. вы по одному читаете байты представления объекта http://eel.is/c++draft/basic.lval#11.3

Vanya-Khodor Автор вопроса
Vlad
все хорошо. вы по одному читаете байты представлен...

Я повторюсь, но тогда непонятно, зачем нужно предложение с исправлением()

Указатель на массив типа и указатель просто на тип - это один и тот же указатель, никакого UB тут нет, кроме того, указатель на char особый случай, он всегда разрешён, не UB.

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
97
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Вопрос вроде правильно, но что надо сделать, чтоб текст был виден нормально ? ghci> TE.decodeUtf8 $ TE.encodeUtf8 "test - проба" "test - \1087\1088\1086\1073\1072"
Fedor
7
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Кто может подсказать? Я преобрпзовал изображение в бинарное(у меня установлен трекбар который при установленном значении меняет пиксели на белый если меньше и чёрный если боль...
Константин VS
6
Карта сайта