Я думаю, что должна быть стандартная функция конструкции.На самом деле libc ++ содержит одну деталь реализации в файле stl_construct.h
.
namespace std{
...
template<typename _T1, typename... _Args>
inline void
_Construct(_T1* __p, _Args&&... __args)
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
...
}
Я думаю, что это полезно, потому что это позволяет сделать "размещение нового" другом.Это отличная точка настройки для типа «только для перемещения», которому требуется uninitialized_copy
в кучу по умолчанию (например, из элемента std::initializer_list
).
У меня есть собственная библиотека контейнеров, которая переопределяетdetail::uninitialized_copy
(из диапазона) для использования пользовательского detail::construct
:
namespace detail{
template<typename T, typename... As>
inline void construct(T* p, As&&... as){
::new(static_cast<void*>(p)) T(std::forward<As>(as)...);
}
}
, который объявлен другом класса только для перемещения, чтобы разрешить копирование только в контексте размещения new.
template<class T>
class my_move_only_class{
my_move_only_class(my_move_only_class const&) = default;
friend template<class TT, class...As> friend void detail::construct(TT*, As&&...);
public:
my_move_only_class(my_move_only_class&&) = default;
...
};