in src/iceberg/expected.h [322:346]
constexpr void reinit_expected(First& new_val, Second& old_val, Args&&... args) noexcept(
std::is_nothrow_constructible_v<First, Args...>) {
if constexpr (std::is_nothrow_constructible_v<First, Args...>) {
if constexpr (!std::is_trivially_destructible_v<Second>) {
old_val.~Second();
}
std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
} else if constexpr (std::is_nothrow_move_constructible_v<First>) {
First tmp(std::forward<Args>(args)...);
if constexpr (!std::is_trivially_destructible_v<Second>) {
old_val.~Second();
}
std::construct_at(std::addressof(new_val), std::move(tmp));
} else {
Second tmp(std::move(old_val));
if constexpr (!std::is_trivially_destructible_v<Second>) {
old_val.~Second();
}
expected_detail::ReinitGuard<Second> guard{std::addressof(old_val),
std::addressof(tmp)};
std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
guard._target = nullptr;
}
}