Box<dyn Error> implements From<&'static str>. This means that you can do something like:
let e: Box<dyn Error> = From::from("nothing here"); // or "nothing here".into();
? turns something that implements std::ops::Try into its Ok type (or returns it if it's the Err variant) - this is basically Options and Results. This does some coercion to make it easier to return multiple return types; specifically, when it gets an error and needs to return , it calls From::from on it. That's why you can use the ? on a result with an Err type of &'static str and it'll be automatically turned into a Box<dyn Error>.