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

Struct foo_int{ unique_ptr<byte> _buf; int& _int;

foo_int(unique_ptr<byte>&& b) : _buf(move(b), _int(*lounder(reinterpret_cast<int*>) _buf.get())
{}

operator int&() {return _int;}
}

Нормально или уб?

29 ответов

50 просмотров

byte в int?

Int-Unsigned Автор вопроса
Kelbon
byte в int?

Я ему lounder сказал, все прочее ок

Int Unsigned
Я ему lounder сказал, все прочее ок

launder может? А есть гарантии, что объект создан?

UB

Int-Unsigned Автор вопроса
Vlad
UB

На сколько я понял lounder, он как раз предназначен для того, чтобы сказать что объект есть. А иначе бы просто каста хватало.

Int Unsigned
На сколько я понял lounder, он как раз предназначе...

std::launder тесно связан с таким явлением, как transparent replacement: http://eel.is/c++draft/basic#life-8

Если это std::byte и std::launder(), а также есть хотя бы массив этих байтов подходящей для int длины и выравнивания, то нормально с C++20.

Vlad
а что делать со strict aliasing?

А (нарушения) его там нет: я просто исхожу из предположения, опять же, что под unique_ptr на самом деле массив байтов, а не один байт.

Sergey Anisimov
А (нарушения) его там нет: я просто исхожу из пред...

как можно проинициализировать инт, не осуществив доступ к памяти байтов через выражение типа инт?

Vlad
как можно проинициализировать инт, не осуществив д...

Так мы осуществляем, просто создание alignas(int) std::byte[sizeof(int)] создает (ретроактивно) и сам int, к которому мы получаем доступ через прачечную (без нее было бы нельзя). Edit: Сам инициализированный int нам же тут не нужен - мы ссылку на него инициализируем же. Т.е. indeterminate-value не вычисляется, если речь об этом.

Sergey Anisimov
Так мы осуществляем, просто создание alignas(int) ...

так для инициализации ссылки все равно valid object нужен, которого нет

Vlad
так для инициализации ссылки все равно valid objec...

А почему нет, если массив байтов есть? Я на это положение ссылаюсь, его должно быть достаточно.

Sergey Anisimov
А почему нет, если массив байтов есть? Я на это по...

массив байтов это не массив интов или вы трактуете этот пункт так, что int создастся неявно в таком массиве?

Vlad
массив байтов это не массив интов или вы трактуете...

Разумеется, это же одна из "фундаментальных магий" этих типов в современном языке) Edit: Это работает только в отношении implicit-lifetime-type, разумеется, но int к ним относится.

Sergey Anisimov
Разумеется, это же одна из "фундаментальных магий"...

я нахожу это толкование расширительным, поэтому иду смотреть на документ, из которого этот параграф пришел

Int-Unsigned Автор вопроса
Sergey Anisimov
Если это std::byte и std::launder(), а также есть ...

Спасибо, добрый человек. А то я совсем загрустил перед перспективой реаллокптор на брутальных сях выписывать.

Vlad
я нахожу это толкование расширительным, поэтому ид...

Несколько удивлен, честно говоря: я предполагал, что эта информация уже давно довольно известна здесь. Если не ошибаюсь, с Вами же не раз уже обсуждали эту тему в т.ч. полагаясь на это положение...

Int-Unsigned Автор вопроса
Vlad
так для инициализации ссылки все равно valid objec...

Ок. Я тудой референс-враппер вставлю вместо ссылки. Он, вообще то, реально там - чтобы мув не терять.

Int Unsigned
Ок. Я тудой референс-враппер вставлю вместо ссылки...

Ну замечание про [] выше было уместное: под это unique_ptr специализирован отдельно, чтобы корректно сочетать new/delete.

Sergey Anisimov
Несколько удивлен, честно говоря: я предполагал, ч...

то, что неявное создание объектов работает и под таким углом, для меня скорее новость

какие у вас планы на ссылку, которую возвращает operator int&?

Vlad
то, что неявное создание объектов работает и под т...

Что, в свою очередь, уже новость для меня =)

возможно, я это забыл когда я думам про неявное создание объектов сейчас, ничего кроме примера с malloc на ум не приходило хотя https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0593r6.html#type-punning я перечитывал не раз

Int-Unsigned Автор вопроса
Vlad
возможно, я это забыл когда я думам про неявное со...

Но по Вашей ссылке /// new (buffer) std::byte[sizeof(buffer)]; /// То есть создание !массива! Массив в плюсах это вообще отдельная магия не поддающаяся разумению.

Int Unsigned
Но по Вашей ссылке /// new (buffer) std::byte[size...

Уточните, что именно не поддается разумению в массивах.

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
53
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
16
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
Карта сайта