Насколько я могу судить, требования к распределителю, который будет использоваться с STL контейнеры размещены в таблице 28 раздела 17.6.3.5 стандарта С++ 11.
Я немного смущен в отношении взаимодействия между некоторыми из этих требований.
Для типа X
, который является распределителем для типа T
, тип Y
, который является "соответствующий класс распределителя" для типа U
, экземпляры a
, a1
и a2
of
X
и экземпляр b
Y
, таблица говорит:
-
Выражение
a1 == a2
оценивается какtrue
, только если выделено хранилище изa1
может быть освобожденоa2
и наоборот. -
Выражение
X a1(a);
хорошо сформировано, не выходит через исключение, и после этогоa1 == a
истинно. -
Выражение
X a(b)
хорошо сформировано, не выходит через исключение и послеa == b
.
Я прочитал это, сказав, что все распределители должны быть конструктивно-копируемыми в таких что копии являются взаимозаменяемыми с оригиналами. Хуже того, то же самое true через границы типов. Это кажется довольно обременительным требованием; в виде насколько я могу судить, это делает невозможным большое количество типов распределителей.
Например, скажем, у меня был класс freelist, который я хотел использовать в своем распределителе,
чтобы кэшировать освобожденные объекты. Если я что-то не упустил, я не мог
включить экземпляр этого класса в распределитель, поскольку размеры или
выравнивания T
и U
могут различаться, и, следовательно, списки фриланда
несовместимо.
Мои вопросы:
-
Правильны ли мои интерпретации?
-
Я читал в нескольких местах, что С++ 11 улучшил поддержку для "stateful распределители ". Как это обстоятельство, учитывая эти ограничения?
-
Есть ли у вас какие-либо предложения о том, как делать то, что я пытаюсь делать? То есть, как я могу включить состояние выделенного типа в свой распределитель?
-
В общем, язык вокруг распределителей кажется неаккуратным. (Например, пролог к таблице 28 говорит, что
a
имеет типX&
, но некоторые из выражения redefinea
.) Кроме того, по крайней мере поддержка GCC является несоответствующей. Что объясняет эту странность вокруг распределителей? Это просто нечасто используемая функция?