zserio::BasicOptional doesn't provide at least conversion move constructor and conversion move assignment operator:
template <typename A, typename U>
zserio::BasicOptional& BasicOptional(BasicOptional<A, U>&& other); // missing
template <typename A, typename U>
zserio::BasicOptional& operator=(BasicOptional<A, U>&& other); // missing
Consider if it's worth to implement those and check what else is deviating from std::optional and consider to implement it.