Используется когда хотим хранить что-то, или ничего (специальное значение)
optional<int> a; a = 5; a = nullopt;
if(a) // есть ли там что-то
struct foo { foo(int, int, int); }
optional<foo> a(in_place, 1, 2, 3); //Создастся, вызвав конструктор a.emplace(4, 5, 6);
variant<A, B, C> v;
Хранит один из элементов типа A
, B
или C
(или больше) (конкретнее - типобезопасный union)
По умолчанию имеет значение первого типа.