Это функции для "in-place" создания и разрушения объектов.
Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть? PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Переносимые _Construct_in_place и _Destroy_in_place
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть? КД>PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии
Здравствуйте, LaptevVV, Вы писали:
КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть? LVV>Дык стандартный аллокатор жеж!
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть?
V>Так зачем тут STL, достаточно С++: V>
V>new (pointer) Type(....); // Создание по месту
V>pointer->~Type(); // Разрушение по месту
V>
V>или я не понял вопроса.
Причина возникновения этих макросов уходит в эпоху динозавров древних BCB, которые (кажется) не умели вызывать деструкторов для встроенных типов и указателей на указатели.
Я посмотрел что ихняя STL вызывает для construct/destroy и настроил свои контейнеры на эти утилиты.
Кроме того, я определял свои destroy-функции с такими же именами — STL вызывала их не сыпала варнинги.
Это было лет так 16 назад. С BCB я попрощался 7 лет назад.
Наверное надо уже определить свои утилиты и не компостировать мозги
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Переносимые _Construct_in_place и _Destroy_in_place
LVV>>Дык стандартный аллокатор жеж! AG>std::allocator::construct / std::allocator::destroy ? AG>deprecated уже ж!
Когда успели-то?
А то я в 11 стандарте пишу — вроде у Джоссатиса не указано, что депрекэйтед.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Переносимые _Construct_in_place и _Destroy_in_place
Для кастомных аллокаторов (не std::allocator) construct и destruct опциональны ещё с С++11.
В стандартном allocator_traits при отсутствии construct и destruct у аллокатрора предусмотрен прямой вызов соответственно placement new и (pseudo) destructor
AG>C++17 AG>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r0.html#4.1
Ну, до этого еще дожить надо... AG>Для кастомных аллокаторов (не std::allocator) construct и destruct опциональны ещё с С++11. AG>В стандартном allocator_traits при отсутствии construct и destruct у аллокатрора предусмотрен прямой вызов соответственно placement new и (pseudo) destructor
Спасибо. Посмотрю непосредственно в стандарте.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Переносимые _Construct_in_place и _Destroy_in_place
Здравствуйте, _NN_, Вы писали: _NN>Здравствуйте, Коваленко Дмитрий, Вы писали: КД>>Возник вопрос — когда в STL появятся стандартные вещи для этих задач? Или они там уже давно есть? КД>>PS. Это, практически, единственное что пришлось откорректировать для сборки достаточно большого проекта в новой студии _NN>А реализация функций какая ?
VS2015 Upd3
// TEMPLATE FUNCTION _Constructtemplate<class _Ty1,
class _Ty2> inline
void _Construct(_Ty1 *_Ptr, _Ty2&& _Val)
{ // construct object at _Ptr with value _Valvoid *_Vptr = _Ptr;
::new (_Vptr) _Ty1(_STD forward<_Ty2>(_Val));
}
template<class _Ty1> inline
void _Construct(_Ty1 *_Ptr)
{ // construct object at _Ptr with default valuevoid *_Vptr = _Ptr;
::new (_Vptr) _Ty1();
}
// TEMPLATE FUNCTION _Destroytemplate<class _Ptrty> inline
void _Destroy(_Ptrty _Ptr)
{ // destroy object at _Ptrtypedef typename pointer_traits<_Ptrty>::element_type _Ty;
_Ptr->~_Ty();
}
VS2017
// TEMPLATE FUNCTION _Construct_in_placetemplate<class _Ty,
class... _Types> inline
void _Construct_in_place(_Ty& _Obj, _Types&&... _Args)
_NOEXCEPT_OP((is_nothrow_constructible<_Ty, _Types...>::value))
{ // invoke True Placement New to initialize the referenced object with _Args...
::new (const_cast<void *>(static_cast<const volatile void *>(_STD addressof(_Obj))))
_Ty(_STD forward<_Types>(_Args)...);
}
// TEMPLATE FUNCTION _Destroy_in_placetemplate<class _Ty> inline
void _Destroy_in_place(_Ty& _Obj) _NOEXCEPT
{ // destroy the referenced object
_Obj.~_Ty();
}
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Переносимые _Construct_in_place и _Destroy_in_place
Два дня думал, как правильно прикрутить _Construct_in_place, чтобы сохранить все его возможности — вызов без аргументов и более чем одним аргументом.
Открыл для себя макросы с переменным числом параметров
Здравствуйте, Коваленко Дмитрий, Вы писали:
RB>>А почему ссылка? RB>>Как можно ссылаться на объект, которые еще не построен?
КД>Я думаю, это типа такая защита от нулевого указателя.
Я это к тому, что код с указателем как в примере из 2015, генерирует проверку указателя на ноль.
Поскольку такая проверка в placement new часто не имеет смысла, я ее подавляю с помощью __assume.
Наверно, вариант с ссылкой не генерирует проверку на ноль.
Вопрос только, насколько "законно" использовать ссылку до конструирования объекта.