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
,它是非拥有字符串版本,其类仅存储指向字符串的第一个元素和字符串大小的指针。还有理由继续使用 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有open
和execve
,Win32有粗略的等价物CreateFile
和CreateProcess
,所有这些函数都对C字符串进行操作。 但最终,您仍然调用str.data()
或str.c_str()
以便与这些 API 进行交互,因此无论str
C 字符串是std::basic_string_view
还是std::basic_string
,C 字符串的使用都不会消失。
您仍然必须了解 C 字符串是什么才能正确使用这些 API。 虽然std::string
保证 NUL 终止符,但std::string_view
不能,并且这两种结构都不保证字符串中的某处没有 NUL 字节。 无论哪种情况,您都必须清理字符串中间的 NUL 字节。
这甚至没有涉及使用 C 字符串的第三方库的丰富性,或者将您自己的使用 C 字符串的代码改装为使用std::string_view
的代码的成本。
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 获取无效的字符串大小
- 为什么此字符串在传递到stoi时被视为无效参数
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 在 C++ 中传递字符串时指针无效
- ld:无效的字符串偏移量...对于".strtab"部分
- C++字符串_Xout_of_range("无效的字符串位置");
- 正在使用C 三元运算符中的字符串常数,一种无效的非效率数组的使用
- 如何避免字符串到整数转换情况下的无效参数异常
- Rapidjson 解析错误:字符串 (207) 中的编码无效
- 将词法强制转换双倍提升为字符串,给出无效结果
- C++17 std::basic_string_view 会使 C 字符串的使用无效吗?
- 用户输入逻辑运算符符号或数字,如果输入字符或字符串则无效
- 如何将无效操作数修复为带有字符串的二进制表达式?
- free():添加字符串时指针无效
- 替换字符串C++中无效的XML unicode序列
- "无法封送'返回值':无效的托管/非托管类型组合",同时使用字符串数组封送委托
- 从"char"到"const char*"的转换无效 [-fpermissive] str::atoi (字符串到整数)
- 为什么在realloc之后字符串在内存中变得无效
- 如何确保当无效字符串作为参数传递时posix_time_zone构造函数不会崩溃