dynamic_cast has only one purpose: casting along an inheritance hierarchy, specifically up the hierarchy as well as down the hierarchy. Let's assume it worked for values as in your example, what will happen here:
bar b{};
auto sliced = dynamic_cast<foo>(b);
The object sliced is of type foo, but contains only the foo subobject of b. This is practically never what you want. Handling instances of polymorphic types by value is not a good option, see also this thread.
For the inverse direction, it is even more obvious why this can't really work well:
bar b{};
foo& f = b;
// Pass f by value to dynamic_cast?! Then, the argument is already
// sliced before the dynamic_cast is even able to determine its
// runtime type.
bar downcast = dynamic_cast<bar>(f);
The comment in the last example is a bit exaggerated, as dynamic_cast is an operator and not a function, but it should pinpoint the issue here: conversions across a hierarchy don't play nice with value semantics, and dynamic_cast reflects that.