1: This can be undestood like so:
enum class SomeEnum : int { V1 = 0, V2 = 1, V3 = 2 };
SomeEnum a = 0; // compile error
SomeEnum b = SomeEnum.V1; // OK
This is basic protection from undefined behavior!
2: Yes and Yes 🙂
SomeEnum c = static_cast<SomeEnum>(1); // = SomeEnum.V2
SomeEnum d = static_cast<SomeEnum>(5); // undefined behavior
static_cast is dangerous by definition, it shoud only be used to support serrialization or old c interfaces!