У меня для вас плохие новости.
В других ответах это уже хорошо описано, но я хотел бы быть более точным по этому поводу: вы не сможете использовать этот интерфейс со строкой, которая использует специальный распределитель . Или с любой другой строкой, если на то пошло.
Чтобы понять, почему, вам нужно знать, что такое std::string
. Если вы найдете "строку" в cppreference, вы будете перенаправлены на страницу для std::basic_string
. Это сделано намеренно, std::basic_string
- это шаблон, который определяет набор строковых классов, а std::string
- один из них.
Если вы посмотрите на определение std::string
, вы увидите, что это определяется как std::basic_string<char>
, что является ярлыком для std::basic_string<char, std::char_traits<char>, std::allocator<char>>
. Это означает, что std::string
уже встроен со своим собственным распределителем , который не расширяется: функции-члены std::allocator<T>::allocate
и std::allocator<T>::deallocate
не являются виртуальными. Предполагая, что вы хотите использовать этот конструктор из std::basic_string
:
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
... это означает, что даже если конструктор использует ссылку на распределитель, эти функции (allocate
и deallocate
) не будут переопределены: конструктор даже не знает о вашей их версии. Вместо этого он будет использовать версии из базового класса.