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 подскажет развёрнутый ответ в реальном времени.