Эта старая Стандартная библиотекарь Мэтта Остерна содержит довольно подробное обсуждение распределителей в целом, в том числе этого лакомого кусочка:
Что мы делаем с пустотой? Иногда контейнер должен ссылаться на пустоту
указатели, и механизм повторного связывания почти дает нам то, что нам нужно, но
не совсем. Это не работает, потому что нам нужно что-то написать
как malloc_allocator :: pointer, и мы определили
malloc_allocator таким образом, что его создание для void будет
незаконным. Он использует sizeof (T) и относится к T &; ни один не является законным, когда
Т пусто. Решение так же просто, как и проблема: специализироваться
malloc_allocator для void , оставляя все, кроме голого
минимум, который нам нужен для ссылки на пустые указатели.
malloc_allocator - это пример реализации, который Остерн использует в своем примере, но он справедлив для общего случая.