Closed apolukhin closed 3 years ago
yndx-antoshkka, 9 января 2019, 21:45 Мне ответил автор bit_cast приблизительно следующее:
Ему не кажется данное предложение хорошей идеей, т.к. bit_cast это no-op меняющий тип у битов. Alignment ортогонален bit_cast, так как проблема не возникает при представлении битов, а лишь при попытке такой указатель разадресовать. Подобное ловится санитайзерами, и может быть вполне валидным кодом в ряде случаев, где полученные указатели не разадресоввываются. В добавок, добавление подобного SFINAE пагубно повлияет на переносимость кода, так как alignment сильно различается на ряде платформ.
У кого какие идеяи/коментарии?
Andrey Davydov, 23 января 2019, 0:07 yndx-antoshkka, в первой ревизии bit_cast ведь в принципе не мог работать с указателями. И хотя от этого решили отказаться, конвертирование указателей по-прежнему не имеет смысла, разыменование сконвертированного указателя все так же нарушает aliasing rules, так что какой смысл накладывать ограничения на alignment?
yndx-antoshkka, 24 января 2019, 17:12 Andrey Davydov, может не нарушать aliasing rules если конвертирование идёт от/к char/unsigned char/byte. Но это скорее граничные случаи.
Кажется что имеет смысл наложить ограничение и на aliasing... Но получается как-то стрёмненько. Может просто забанить конвертирование указателей?
Andrey Davydov, 24 января 2019, 17:30
Может просто забанить конвертирование указателей?
Так в R0 оно было забанено, но от этого отказались в R1. Мотивация тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html#rev, то что заворачивание указателя в структуру ломает этот запрет.
yndx-antoshkka, 20 июля 2020, 20:08 Предложение отклонили, сказав что заворачивание в структуру слишком легко ломает этот кейс. Так же сказали, что кастование из std::byte например в int является нормой, и проверять должна не эта функция, а сам пользователь (функция низкоуровневая и не должна иметь оверхед)
Перенос предложения: голоса +3, -1 Автор идеи: ilnurkh
в текущем предложение к C++20 std::bit_cast<T> не отличается от reintrepret_cast<T>
предлагается этот случай обработать и сделать дополнительные проверки, например проверять выравнивание указателей.