#cpp
При инициализации неинициализированной памяти в аллокаторах (например, в функции uninitialized_fill) используют placement new такого вида ::new (static_cast(&*buf))T(value), где buf - уже выделенный участок памяти, T(value) - вызов конструктора. Для чего нужен static_cast (...)? Для чего нужно &*buf?
Ответы
Ответ 1
Для чего нужен static_cast(...)? Приведение к void* нужно, чтобы исключить возможность вызова пользовательского размещающего new. Пример: #include struct A { }; void* operator new(std::size_t, A* a) { std::cout << "user new\n"; return a; } int main() { A* p = static_cast( malloc(sizeof(A)) ); new (static_cast (p)) A; // built-in new (p) A; // user-defined } Для чего нужно &*buf? Т.к. buf это в общем случае, не просто голый указатель, а итератор, то пара &* используется для получения адреса (голого указателя). В более правильном варианте эта конструкция будет выглядеть и вовсе как: std::addressof(*buf)) Использование std::addressof необходимо по причине того, что operator& может быть перегружен для типа *buf.
Комментариев нет:
Отправить комментарий