Насколько я могу судить, требования к распределителю, который будет использоваться с 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 является несоответствующей. Что объясняет эту странность вокруг распределителей? Это просто нечасто используемая функция?