История изменений
Исправление KennyMinigun, (текущая версия) :
Не конкретно здесь, а вообще(описание на cppreference глянул, но въехать не получилось)
Как я понял, там скорее всего как с std::atomic — больше указание компилятору нежели реальные действия.
Вот например:
struct X {
const int n; // note: X has a const member
int m;
};
X *p = new X{3, 4};
const int a = p->n;
X* np = new (p) X{5, 6};
const int b = p->n; // undefined behavior
Вот тут компилтор может загрузить значение p->n до того, как будет прозиведено placement-new. В результате b может быть 3 вместо ожидаемого 4.
std::launder(p)
— ставит «барьер» и заставляет компилятор реально посмореть что же находится под p.
Т.е. с каждым поколением С++ оптимализатор становится все злее и агрессивнее.
Исходная версия KennyMinigun, :
Не конкретно здесь, а вообще(описание на cppreference глянул, но въехать не получилось)
Как я понял, там скорее всего как с std::atomic — больше указание компилятору нежели реальные действия.
Вот например:
struct X {
const int n; // note: X has a const member
int m;
};
X *p = new X{3, 4};
const int a = p->n;
X* np = new (p) X{5, 6};
const int b = p->n; // undefined behavior
Вот тут компилтор может загрузить значение p->n до того, как будет прозиведено placement-new. В результате b может быть 3 вместо ожидаемого 4.
std::launder(p)
— ставит «барьер» и заставляет компилятор реально посмореть что же находится под p.