Yes, it works this way because the first string is defined in the string() parameter, while the second isn't.

My point in this respect is: Shouldn't both strings behave the same, whether or not they are defined in string()?

According to the manual, strings that are not defined in string() are initialized to empty strings automatically. However, these empty strings behave slightly different than empty strings that are defined in string(), because the latter already have a char array allocated, while the former have not. I thought there shouldn't be such a difference. (It's just a minor thing, of course.)