In practical terms, none. They are the same, and the same as using the curly braces.
From the POV of the standard, those are different kinds of initializations.
C++ has like 12 different ways of initializing variables, and the differences are quite confusing, but in practical terms in my experience I never had to care too much beside making sure native types are initialized to some specified value.
You can probably find some talks on YouTube talking about the initializations of c++, and 1h30m is probably not enought to cover all the details :')
For this particular example direct initialization i.e. std::string product("not worked"); would be preferred, as you end up using one call to constructor instead of two: default constructor followed by the move assignment.
Not a C++ person, so please forgive my ignorance, but what is the difference between the above and sth. like:
or (Are these even legal C++ statements and, if not, why not? ;-))