使用分配器构造函数的uninitialized_X函数?

时间:2019-02-08 07:08:39

标签: c++ c++11 allocator placement-new c++20

是否有一个uninitialized_value_construct版本使用分配器来构造元素而不是放置new

以下是uninitialized_value_construct的原型实现;但是我正在寻找分配器通过的地方,所以我可以使用行alloc.construct(std::addressof(*current))代替::new (std::addressof(*current))

template<class ForwardIt>
void uninitialized_value_construct(ForwardIt first, ForwardIt last)
{
    using Value = typename std::iterator_traits<ForwardIt>::value_type;
    ForwardIt current = first;
    try {
        for (; current != last; ++current) {
            ::new (static_cast<void*>(std::addressof(*current))) Value();
        }
    } catch (...) {
        std::destroy(first, current);
        throw;
    }
}

在C ++ 20中,有uninitialized_construct_using_allocator,但不清楚它的用途或用法。


编辑:在与@NicolBolas交谈之后,我最终实现了这对函数(我希望在std::中)。为了我的需要(在不失一般性的前提下,我将对其他uninitialized_X函数进行此操作。

template<class Alloc, class ForwardIt, class Size, class AT = typename std::allocator_traits<Alloc>>
ForwardIt uninitialized_value_construct_n(Alloc& a, ForwardIt first, Size n){
    using T = typename std::iterator_traits<ForwardIt>::value_type;
    ForwardIt current = first;
    try{
        for(; n > 0; (void) ++current, --n) 
            AT::construct(a, std::addressof(*current), T());
//          ::new (static_cast<void*>(std::addressof(*current))) T();
        return current;
    }catch(...){destroy(a, first, current); throw;}
}
template<class Alloc, class ForwardIt, typename AT = typename std::allocator_traits<Alloc> >
void destroy(Alloc& a, ForwardIt first, ForwardIt last){
    for(; first != last; ++first) 
        AT::destroy(a, std::addressof(*first));
    //  destroy_at(std::addressof(*first));
}

1 个答案:

答案 0 :(得分:1)

遗憾的是,没有uninitialized_construct的带分配器的远程版本。

关于uninitialized_construct_using_allocator的用途,它通过分配器构造具有给定参数的给定类型的单个对象。这样做似乎很简单(std::allocator_traits<Alloc>::construct(t, alloc, std::forward<Args>(args)...)),但是这样做的方式是将分配器正确传播到该{{1}使用的scoped_allocator }。这就需要一个bunch of techniques,它并不为人所知,也不容易理解,因此有一个特定的功能可以实现。