Используйте конструктор на месте.
В boost это этот конструктор , который принимает переменную in_place_init_t
, а затем создает на месте со следующими аргументами.
boost::optional<B> op(boost::in_place_init, a);
// Calls `B::B(A&) with `a`
Или для продолжения использования in_place
, который по умолчанию принимает ссылку на константу, укажите, что это не ссылка на константу:
boost::optional<B> op(boost::in_place<A&>(a));