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

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

本文关键字:无效 字符串 会使 basic std string view C++17      更新时间:2023-10-16

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

还有理由继续使用 C 字符串吗?

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

在设计只需要字符的只读表示形式的函数或方法的接口时,您将希望首选std::string_view. 例如,搜索字符串、生成大写副本、打印它等。

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

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

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

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

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

">

无效"在这里有一个技术含义,我认为这是无意的。 听起来"消除"是预期的词。

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

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

这甚至没有涉及使用 C 字符串的第三方库的丰富性,或者将您自己的使用 C 字符串的代码改装为使用std::string_view的代码的成本。