std::variant может войти в состояние, называемоебесценным по исключению".
Как я понимаю, общей причиной этого является то, что назначение перемещения вызывает исключение. Не гарантируется, что старое значение варианта больше не будет присутствовать, как и предполагаемое новое значение.
std::optional, однако, не имеет такого состояния. cppreference делает смелое утверждение:
Если выдается исключение, состояние инициализации * this... не изменяется, т.е. если объект содержит значение, он все еще содержит значение, и наоборот.
Как std::optional может избежать того, чтобы стать "бесполезным по исключению", а std::variant - нет?