Я пытался использовать пользовательский распределитель для std::vector<char>
, но я заметил, что std::vector
не нуждается ни в одной из функций-членов из моего распределителя. Как это возможно?Пользовательский распределитель для std :: vector <char> проигнорирован
#include <vector>
struct A : private std::allocator<char> {
typedef std::allocator<char> alloc;
using alloc::value_type;
using alloc::pointer;
using alloc::const_pointer;
using alloc::difference_type;
using alloc::size_type;
using alloc::rebind;
// member functions have been removed, since the program compiles without them
};
int main() {
std::vector<char, A> v;
v.resize(4000);
for (auto& c : v)
if (c)
return 1; // never happens in my environment
return 0; // all elements initialized to 0. How is this possible?
}
Я пытался вышеуказанную программу с онлайн-C++ 11 компилятором (LiveWorkSpace), обеспечивая г ++ 4.7.2, 4.8 и 4.6.3.
В основном allocate()
, deallocate()
, construct()
и destroy()
не определены в моем распределителе, но программа компилируется и все элементы будут инициализированы 0.
На самом деле, почему желательно, чтобы он по-прежнему работал, если пользователь предоставляет 'std :: allocator' в качестве распределителя для вектора '? Разве не имеет смысла получать ошибку компилятора? –
Я не уверен, что это желательно лично, но это всегда было так. Для других контейнеров имеет смысл: если пользователь говорит 'std :: map, std :: allocator >>' это удобство принимать его, хотя технически распределитель должен быть 'std :: allocator >' –
@AndyProwl - распределители действительно должны быть параметрами шаблона шаблона, но параметры шаблона шаблона не существовали в то время, когда STL (ПРИМЕЧАНИЕ: ** STL **, а не ** Стандартная библиотека **) была разработана, поэтому была создана «rebind». –