C++17 std::basic_string_view 是否会使 C 字符串的使用无效?

Does C++17 std::basic_string_view invalidates the use of C strings?

C++17 引入了 std::basic_string_view,它是非拥有字符串版本,其 class 仅存储指向字符串第一个元素的指针和字符串的大小。还有理由继续使用 C 字符串吗?

"Invalidate" 在这里有技术意义,我认为是无意的。听起来 "obviate" 是预期的词。

您仍然需要生成和使用 C 字符串才能与通用 API 交互。例如,POSIX 有 openexecve,Win32 有粗略的等价物 CreateFileCreateProcess,所有这些函数都对 C 字符串进行操作。但最后,您仍然调用 str.data()str.c_str() 以便与这些 API 交互,因此 C 字符串的使用不会消失,无论 str 是否是 std::basic_string_viewstd::basic_string.

您仍然需要了解什么是 C 字符串才能正确使用这些 API。虽然 std::string 保证 NUL 终止符,但 std::string_view 不保证,并且两个结构都不能保证字符串中某处没有 NUL 字节。在任何一种情况下,您都必须清除字符串中间的 NUL 字节。

这甚至不涉及使用 C 字符串的第 3 方库的财富,或者将您自己使用 C 字符串的代码改造为使用 std::string_view.

的成本。

Is there still a reason to keep using C strings?

我认为可以公平地说,除了使用 C API 之外,从来没有 成为使用 C 字符串的理由。

在设计只需要只读字符表示的函数或方法的接口时,您会更喜欢 std::string_view。例如。搜索字符串、生成大写副本、打印它等等。

在设计一个接受字符串副本的接口时,您应该更喜欢第一个和最后一个迭代器。但是,std::string_view 可以被认为是这些迭代器的代理,因此 string_view 是合适的。

如果您想获得一个长字符串的所有权,可能更喜欢通过值或右值引用传递 std::string

在设计一个对象来编组对期望以 null 结尾的字符串的 c API 的调用时,您应该更喜欢 std::string 或 std::string const& - 因为它的 c_str () 方法将正确生成以空字符结尾的字符串。

在对象(不是临时代理)中存储字符串时,更喜欢std::string。

当然,在 C++ 中使用 const char* 作为数据的所有者是不合适的。总有更好的方法。自 c++98 以来就是如此。