std::bit_cast<T*> должен проверять выравнивание

ilnurkh
ilnurkh

в текущем предложение к C++20 std::bit_cast<T*> не отличается от reintrepret_cast<T*>

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

2
рейтинг
в разработке
4 комментария
yndx-antoshkka

Мне ответил автор bit_cast приблизительно следующее:

Ему не кажется данное предложение хорошей идеей, т.к. bit_cast это no-op меняющий тип у битов. Alignment ортогонален bit_cast, так как проблема не возникает при представлении битов, а лишь при попытке такой указатель разадресовать. Подобное ловится санитайзерами, и может быть вполне валидным кодом в ряде случаев, где полученные указатели не разадресоввываются. В добавок, добавление подобного SFINAE пагубно повлияет на переносимость кода, так как alignment сильно различается на ряде платформ.

У кого какие идеяи/коментарии?

yndx-antoshkka
Andrey Davydov

yndx-antoshkka, в первой ревизии bit_cast ведь в принципе не мог работать с указателями. И хотя от этого решили отказаться, конвертирование указателей по-прежнему не имеет смысла, разыменование сконвертированного указателя все так же нарушает aliasing rules, так что какой смысл накладывать ограничения на alignment?

Andrey Davydov
yndx-antoshkka

Andrey Davydov, может не нарушать aliasing rules если конвертирование идёт от/к char/unsigned char/byte. Но это скорее граничные случаи.

Кажется что имеет смысл наложить ограничение и на aliasing... Но получается как-то стрёмненько. Может просто забанить конвертирование указателей?

yndx-antoshkka
Andrey Davydov

Может просто забанить конвертирование указателей?

Так в R0 оно было забанено, но от этого отказались в R1. Мотивация тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html#rev, то что заворачивание указателя в структуру ломает этот запрет.

Andrey Davydov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения