[*] Объект x находится на адресе a
[*]
Код: Выделить всё
x
[*] Тип x такой же, что и T, игнорируя CV-квалификаторы на каждом уровне
[*] Каждый байт, который будет достижимы через результат, достижимый через p. Полем .
Тогда std :: raunder (p) Возвращает значение типа t*, который указывает на объект x . В противном случае, поведение не определено. Утилита в ситуациях, когда один объект погиб, а другой начал свою жизнь в память, и вам просто нужно рассказать об этом компилятору. Но если я правильно его читаю, std :: raunder можно использовать для более того.
Код: Выделить всё
struct S {
int i;
S(int i, int j) : i(i), j(j) {}
private:
int j;
};
int main() {
S s(10, 20);
int *pi = reinterpret_cast(&s);
int *pi_good = std::launder(pi);
}
(это также означало бы, что std :: rainderpret_cast (std :: rand ())
Код: Выделить всё
#include
struct Holder {
// unsigned char required to provide storage
unsigned char storage[4];
// make it a non-trivial type
~Holder() {};
template
void hold() {
::new(static_cast(storage)) T;
}
};
int main() {
Holder h;
h.hold();
Holder *ph = &h;
[[maybe_unused]] Holder *ph_laundered = std::launder(ph);
}
*Последняя пуля в одном int путем изменения s на класс s {int i; }; где я является частным.
Подробнее здесь: https://stackoverflow.com/questions/797 ... y-location