Почему allocator в c ++ обеспечивает специализацию для типа void - PullRequest
12 голосов
/ 22 августа 2011

Я заметил, что распределитель в c ++ обеспечивает специализацию для типа void.Есть ли какая-то особая цель для этого?Нет смысла выделять память для типа void, верно?

Ответы [ 2 ]

9 голосов
/ 22 августа 2011

Эта старая Стандартная библиотекарь Мэтта Остерна содержит довольно подробное обсуждение распределителей в целом, в том числе этого лакомого кусочка:

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

malloc_allocator - это пример реализации, который Остерн использует в своем примере, но он справедлив для общего случая.

2 голосов
/ 22 августа 2011

Распределитель должен быть специализирован для void, потому что у вас не может быть ссылок на void.

...