Я продолжаю искать, но кажется, что разработчики компиляторов не заинтересованы в их поддержке.
Мне это кажется странным - в основном, текущий C ++ имеет ограничения на союзы, которые всегда были раздражением и никогда не были уместны. Можно подумать, что удаление нескольких проверок на ошибки было бы относительно простым способом пометить дополнительный блок поддержки c ++ 0x, но, к сожалению, ни один разработчик компилятора этого не сделал.
Меня интересует то, что он обеспечивает простое решение повторяющейся проблемы кодирования структуры данных - как зарезервировать память для экземпляра некоторого неизвестного типа (параметра шаблона), предпочтительно с максимально возможной безопасностью типов в обстоятельства, но без вызова какого-либо конструктора, который, как оказалось, определен для этого типа. Действительно важным моментом является то, что правила выравнивания должны соблюдаться.
Для этого идеально подходит неограниченное объединение - оно дает вам тип, у которого нет конструкторов или деструкторов, но который имеет правильный размер и выравнивание, чтобы разрешить любой элемент. Есть, конечно, способы явного конструирования и разрушения, когда это необходимо, и когда вам нужен типобезопасный доступ, вы просто используете соответствующий член объединения для доступа к нему. Поддержка "правильных" союзов также может быть полезна, но вы получаете огромные преимущества даже для одного члена профсоюза, такого как ...
union Memory_For_Item_t
{
Item_t m_Item;
};
Даже с использованием стандартизированных функций обработки выравнивания в C ++ 0x этот подход выигрывает для удобства и безопасности, например, когда. Вы хотите пространство для x элементов в узле, не все из которых будут использоваться (или создаваться) в любое время. Без C ++ 0x мы все еще находимся в нерешительности с проблемами выравнивания WRT - каждый компилятор делает это по-своему нестандартно.
Единственная проблема с неограниченными профсоюзами - я не могу их найти.