In a previous blog post, I discussed the reasons why I passed std::wstring objects by const&, instead of using std::wstring_view. The key point was that those strings were passed as input parameters to C-interface API functions, that expected null-terminated C-style strings.
In particular, the standard string classes like std::string and std::wstring offer the c_str method, which returns a pointer to a read-only string buffer that is guaranteed to be null-terminated. This method is only available in the const version; there is no non-const overload of c_str that returns a character buffer with read/write access. If you need read-write access to the internal string character buffer, you need to invoke the data method, which is available in both const and non-const overloaded forms. The string‘s data method guarantees that the returned buffer is null-terminated.
On the other hand, the string view‘s data method does not offer this null-termination guarantee. In addition, there is no c_str method available for string views (which makes sense if you think that c_str implies a null-terminated C-style string pointer, and [w]string_views are not guaranteed to be null-terminated).
The properties discussed in the above paragraph can be summarized in the following comparison table:
Method | [w]string | [w]string_view |
c_str (const) | Returns null-terminated read-only string buffer | N/A |
c_str (non-const) | N/A | N/A |
data (const) | Returns null-terminated read-only string buffer | No guarantee for null-termination |
data (non-const) | Returns null-terminated read/write string buffer | No guarantee for null-termination |
Suggestion for the C++ Standard Library: Null-terminated String Views?
As a side note, it probably wouldn’t be bad if null-terminated string views were added to the C++ standard library. That would make it possible to pass instances of those null-terminated string views instead of const& to string objects as input strings to C-interface APIs.