What drawbacks would exist if std::string::substr returned std::string_view?
When string_view
was invented, there was too much debate on whether it should be there. All the opposing arguments were flowing from examples like the one you showed.
However, like I always tell everyone with such bad examples: C++ is not Java, and is not Python. C++ is a low-level language, where you have almost full control over memory, and I repeat the cliché from Spiderman: With great power comes great responsibility. If you don't know what string_view
is, then don't use it!
The other part of your question has a simple answer, and you answered it yourself:
Would there be any drawbacks if substr returned std::string_view (besides the obvious drawback: losing some compatibility with C++14)?
The harm is that every program that used a copy of the string from substr
may not be valid anymore. Backward compatibility is a serious thing in the computer business, which is why Intel's 64-bit processors still accept x86 instructions, which is also why they're not out of business. It costs a lot of money to reinvent the wheel, and money is a major part in programming. So, unless you're planning to throw all C++ in the garbage and start over (like RUST did), you should maintain the old rules in every new version.
You can deprecate stuff, but very carefully and very slowly. But deprecation isn't like changing the API, which is what you're suggesting.
The drawback is crystal clear: it would be a significant API breaking change vs every version of C++ going back to the beginning.
C++ is not a language that tends to break API compatibility.
Here is a concrete (if slightly incomplete) example of code that is currently safe, but would become undefined behaviour with the change:
std::string some_fn();
auto my_substr = some_fn().substr(3, 4);
// ... make use of my_substr ...
Arguably the use of auto
is a little dubious here, but it is completely reasonable (in my opinion) in the following situation, where repeating the type name would be almost redundant:
const char* some_fn();
auto my_substr = std::string(some_fn()).substr(3, 4);
// ... make use of my_substr ...
Edit: Even if substr()
had always returned a std::string_view
, you can imagine this code causing some pain, even if only during development/debugging.