
template <typename Derived, typename Rhs>
Derived &operator|=(BinopsBase<Derived> &lhs, Rhs const &rhs)
{
    Derived tmp{ Derived{der(lhs)} |= rhs };
    tmp.swap(der(lhs));
    return der(lhs);
}

template <typename Derived, typename Rhs>
Derived operator|(BinopsBase<Derived> &&lhs, Rhs const &rhs)
{
    return der(std::move(lhs)) |= rhs;
}

template <typename Derived, typename Rhs>
Derived operator|(BinopsBase<Derived> const &lhs, Rhs const &rhs)
{
    return Derived{der(lhs)} |= rhs;
}
