HardlifetimeUB
Чем std::launder полезен?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::launder (C++17) — сообщает компилятору, что по указателю может жить объект другого типа/значения, чем компилятор «думает». Заставляет считать указатель «свежим» после placement new в существующей памяти.
alignas(int) std::byte buf[sizeof(int)];
new (buf) int(42);
int* p = std::launder(reinterpret_cast<int*>(buf));
// без launder компилятор мог закэшировать знание о buf и не перечитатьНеобходимо когда: объект создан placement new по адресу другого объекта; используется const-член, изменившийся через mutable/placement new; в type-punning сценариях. На практике применяется редко, в основном в реализации optional/variant.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.