Я хочу создать не копируемый распределитель (в C ++ 14), который просто выделяет фиксированный блок памяти, который может использовать std::vector
.Я хочу предотвратить копирование распределителя (и, следовательно, также вектора), чтобы предотвратить случайное выделение памяти пользователем.Распределитель предназначен только для использования с std::vector
или, может быть, std::string
.
Так что мой распределитель имеет конструктор копирования, подобный этому:
static_allocator(const static_allocator<T>&) = delete;
При вызове:
std::vector<int, static_allocator<int>> vvv(static_allocator<int>(3));
Я получаю следующую ошибку компиляции:
/usr/include/c++/5/bits/stl_vector.h: In instantiation of ‘std::_Vector_base<_Tp, _Alloc>::_Vector_impl::_Vector_impl(const _Tp_alloc_type&) [with _Tp = int; _Alloc = static_allocator<int>; std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type = static_allocator<int>]’:
/usr/include/c++/5/bits/stl_vector.h:128:20: required from ‘std::_Vector_base<_Tp, _Alloc>::_Vector_base(const allocator_type&) [with _Tp = int; _Alloc = static_allocator<int>; std::_Vector_base<_Tp, _Alloc>::allocator_type = static_allocator<int>]’
/usr/include/c++/5/bits/stl_vector.h:265:18: required from ‘std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = int; _Alloc = static_allocator<int>; std::vector<_Tp, _Alloc>::allocator_type = static_allocator<int>]’
Ошибка возникает, по-видимому, из-за того, что в stl_vector.h:265
нет конструктора для определенных распределителей rvalue:
/**
* @brief Creates a %vector with no elements.
* @param __a An allocator object.
*/
explicit
vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _Base(__a) { }
Хотя код глубже фактически поддерживает распределители rvalue, но они не вызываются, потому что rvalue берется по ссылке конструктором, упомянутым выше.
Является ли это отсутствующей функцией в C ++ 14 или я отсутствуеткакой-то вариант?Также странно, что распределитель копируется при построении вектора без очевидных причин.
Полный пример кода можно найти здесь: https://onlinegdb.com/ByqXwQ4k4