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 有 open
和 execve
,Win32 有粗略的等价物 CreateFile
和 CreateProcess
,所有这些函数都对 C 字符串进行操作。但最后,您仍然调用 str.data()
或 str.c_str()
以便与这些 API 交互,因此 C 字符串的使用不会消失,无论 str
是否是 std::basic_string_view
或 std::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 以来就是如此。
C++17 引入了 std::basic_string_view
,它是非拥有字符串版本,其 class 仅存储指向字符串第一个元素的指针和字符串的大小。还有理由继续使用 C 字符串吗?
"Invalidate" 在这里有技术意义,我认为是无意的。听起来 "obviate" 是预期的词。
您仍然需要生成和使用 C 字符串才能与通用 API 交互。例如,POSIX 有 open
和 execve
,Win32 有粗略的等价物 CreateFile
和 CreateProcess
,所有这些函数都对 C 字符串进行操作。但最后,您仍然调用 str.data()
或 str.c_str()
以便与这些 API 交互,因此 C 字符串的使用不会消失,无论 str
是否是 std::basic_string_view
或 std::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 以来就是如此。