2015-11-24 2 views
0

Существуют ли какие-либо прецеденты, в которых нужно использовать соединение, а boost :: variant нельзя использовать?Рекомендация boost :: variant over union

В частности:Существуют ли какие-либо проблемы, которые профсоюзы могут решить и повысить: вариант не может?

Как рекомендует стандартный комитет C++ using variant instead of union .

+1

[Тип-punning] (https://en.wikipedia.org/wiki/Type_punning)? Функции, которые ожидают аргументы 'union'? Когда Boost недоступен или не может быть использован? –

+3

@JoachimPileborg Является ли тип punning через объединения UB в C++, когда вы читаете поле, отличное от последнего последнего? –

+0

Это UB, но люди все еще используют его, поэтому компиляторы неохотно допускают его в некоторых ограниченных случаях. –

ответ

2

Хотя профсоюзы технически допускают некоторые вещи, которые не будут иметь вариантов, на практике эти вещи являются неопределенным поведением.

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

Что касается переносимости, их не было бы, потому что UB означает «все может случиться».

Тот факт, что некоторые компиляторы лечения как реализации Defined на текущий действительно просто примечание стороны в рамках стандарта C++

Варианты стремятся сделать дискриминационный союз (tuple(union, discriminant)) безопасный, немного похожий на массив_view предназначен для обеспечения безопасности tuple(pointer, size).

Смежные вопросы