Оба связаны с pointer provenance и strict aliasing, но решают разные проблемы.
🍴 std::launder — обход оптимизаций
Когда компилятор «знает» значение через const member или reference, он может закешировать его:
struct S { const int x; };
S* p = new (addr) S{42};
p->x; // Компилятор: "всегда 42"
new (p) S{100}; // Переиспользуем память
p->x; // Всё ещё 42? Нет, но компилятор так думает!
auto q = std::launder(p);
q->x; // Правильно: 100launder заставляет компилятор перечитать значение из памяти, игнорируя предыдущие предположения.🍬 start_lifetime_as — создание lifetime
Он нужен когда объекта физически нет, но память готова:
alignas(int) char buffer[sizeof(int)];
*reinterpret_cast<int*>(buffer) = 42; // UB: нет объекта
int* p = std::start_lifetime_as<int>(buffer);
*p = 42; // OK: объект создан
🏝 Вывод
launder — для существующих объектов с переписанной памятью. start_lifetime_as — для памяти, которая станет объектом.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом