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