Вопрос чисто практический. Пытаюсь собрать примеры кода, которые работают по разному с std::launder и без него.
На cppreference подано 3 примера (в моем понимании):
- Подменяется обьект (struct X) с const member (const int X::n) в куче через placement new и доступ к его данным через старый указатель (p) есть UB
- Обьект (struct Y) создается в заранее алоцированном пространстве, но с другим типом (std::byte[] s). Использование созданного обьекта используя только reinterpret_cast есть UB.
- Метод обьекта подменяет *this, использование обьекта (struct A) по старой ссылке есть UB.
У меня получилось только для пункта 3 собрать пример, когда работа кода отличается: https://wandbox.org/permlink/qi5yoGmIPgeset9I
Для пункта 1 у меня не удается «обмануть» компилятор (я хочу, чтоб он закешировал значение root.next и код вошел в вечный цикл): https://wandbox.org/permlink/A1DDj7KInEKRP4uG
Для пункта 2 пока нет идей откуда может произойти UB.
Есть у кого идеи как увидеть UB из-за неиспользования std::launder? (UBSAN в планах тоже)