[cfe-dev] [libcxx] Small semantic error in __split_buffer::__construct_at_end(size_type) ?

Jared Hoberock jaredhoberock at gmail.com
Sun Aug 28 03:36:00 PDT 2011


I think I may have come across a small bug in the implementation of
__split_buffer within libcxx.

__split_buffer::__construct_at_end passes a default-constructed
value_type to __alloc_traits::construct:

template <class _Tp, class _Allocator>
void
__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n)
{
    __alloc_rr& __a = this->__alloc();
    do
    {
        __alloc_traits::construct(__a,
_VSTD::__to_raw_pointer(this->__end_), value_type());
        ++this->__end_;
        --__n;
    } while (__n > 0);
}

This should eventually cause the invocation of value_type's copy
constructor somewhere in the allocator.

Compare this to vector::__construct_at_end, which simply calls
__alloc_traits::construct with no additional argument:

template <class _Tp, class _Allocator>
void
vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
{
    allocator_type& __a = this->__alloc();
    do
    {
        __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
        ++this->__end_;
        --__n;
    } while (__n > 0);
}

This should eventually cause the invocation of value_type's default
constructor somewhere in the allocator.

I'd argue that it's important to preserve the original semantic (i.e.,
the allocator should invoke the no-argument constructor).  It seems
like __split_buffer::__construct_at_end should be implemented
identically to vector's function (i.e., no need to pass along
value_type()).

For context, this issue arose when investigating a solution to
avoiding default initialization of elements in standard containers
[1].

[1] http://stackoverflow.com/questions/7218574/avoiding-default-construction-of-elements-in-standard-containers



More information about the cfe-dev mailing list