Список операций, которые запускают, это описано здесь: https://timsong-cpp.github.io/cppwp/n48 ... .object#13
тривиальный пример будет:
Код: Выделить всё
#include // std::launder
int main() {
unsigned char* storage = new unsigned char[sizeof(float)]; // implicitly creates object
float* pobj = std::launder(reinterpret_cast(storage));
*pobj = 3.14f;
}
Код: Выделить всё
#include // std::launder
void foo(unsigned char* storage) {
float* pobj = std::launder(reinterpret_cast(storage));
*pobj = 3.14f;
...
}
< /code>
Предположим, что хранилище не используется в другой функции или TU. Буквально читая стандарт, это все еще хорошо определен, но как компилятор может «знать», потому что он не может видеть точку создания. Стандарт тогда просто говорит, что если есть другая функция: < /p>
#include // std::launder
#include // std::uint32_t
void bar(unsigned char* storage) {
std::uint32_t* pobj = std::launder(reinterpret_cast(storage));
*pobj = 42;
...
}
< /code>
Компилятор должен будет сделать то же предположение, что и выше, на этот раз для объекта std :: uint32_t < /code>.
Но тогда не дано никакой гарантии на следующем выходе программы, это неопределенное поведение. < /p>
int main() {
unsigned char* storage = new unsigned char[sizeof(float)];
foo(storage);
bar(storage);
delete [] storage;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... boundaries
Мобильная версия