#include <cstdint>
using namespace std;

class cmw_user_input_data_member_flags {
public:
    enum E : int16_t {
        default_ = 0x0,
        headers = 0x1,
        middlefile = 0x2,
        choices = 0x4
    };
    constexpr cmw_user_input_data_member_flags() noexcept {};
    constexpr explicit cmw_user_input_data_member_flags(E v) noexcept : val{v} {};

    cmw_user_input_data_member_flags(const cmw_user_input_data_member_flags& o)
                                    noexcept : val{o.val} {};

    cmw_user_input_data_member_flags& operator=(E v) noexcept 
        {val = v; return *this;};

    cmw_user_input_data_member_flags& 
        operator=(cmw_user_input_data_member_flags& o) noexcept 
        {val = o.val; return *this;};

    operator E() const noexcept {return val;};
protected:
    E val{default_};
private:
    //operator int() const; // eventually
};

int main() {
    using Flags = cmw_user_input_data_member_flags;
    Flags x{Flags::headers};
    //Flags y{0x1}; // not valid
    Flags z;
    z = Flags::choices;
}
