ExitCode class and derived Status class able to return a value
Overall I would say this is good code. Still, there are a few things that you should (or, at least, could) improve:


TResult&amp; GetResult() const is a bug. This should read TResult const&amp; GetResult() const (and if you had done more testing, your compiler likely should have told you). 
You are missing an include (#include &lt;utility&gt;) for std::move.
Depending on how you intend to use these classes, you should add a virtual destructor to ExitCode. The reason is that, if you do fancy polymorphism and try to delete an instance of Status through a pointer to ExitCode, you get undefined behavior. If you don't care about the possible polymorphism, you should be fine as-is.
I share your worry about implicit conversions. I would consider making your constructors explicit.
Keep your formatting consistent. Although your formatting is almost always the same, there is one place where you diverge from it, namely const std::string &amp; msg = "" in the first two constructors of Status. Why do you have a space between std::string and &amp;? (I suppose it's just some oversight of yours).
Why is the default value to two of the constructors of Status for the parameter state TState::OK, but the last constructor has TState::FAILED instead? This is very likely to cause confusion.