Considering a code like this:
std::string str = "abcdef"; const size_t num = 50; const size_t baselen = str.length(); while (str.length() < num) str.append(str, 0, baselen); Is it safe to call std::basic_string<T>::append() on itself like this? Cannot the source memory get invalidated by enlarging before the copy operation?
I could not find anything in the standard specific to that method. It says the above is equivalent to str.append(str.data(), baselen), which I think might not be entirely safe unless there is another detection of such cases inside append(const char*, size_t).
I checked a few implementations and they seemed safe one way or another, but my question is if this behavior is guaranteed. E.g. "Appending std::vector to itself, undefined behavior?" says it's not for std::vector.
str += str;is legal and it boils down to the same thing so I guess it is fine.vector, it's a lot less likely.