C ++ 17引入了std::basic_string_view
,它是非拥有的字符串版本,其类只存储指向字符串的第一个元素和字符串大小的指针。还有理由继续使用C字符串吗?
答案 0 :(得分:8)
还有理由继续使用C字符串吗?
我认为除了与C API说话之外,还有从不是使用C字符串的理由。
当设计一个只需要只读字符表示的函数或方法的接口时,你会想要std::string_view
。例如。搜索字符串,生成大写副本,打印它等等。
当设计一个接受一串字符副本的接口时,你应该更喜欢第一个和最后一个迭代器。但是,std::string_view
可以被视为这些迭代器的代理,因此string_view
是合适的。
如果您想获取长字符串的所有权,可能更喜欢通过值或r值引用传递std::string
。
当设计一个对c语言调用期望空终止字符串的对象时,你应该更喜欢std :: string或std :: string const& - 因为它的c_str()方法将正确生成以null结尾的字符串。
在对象(非临时代理)中存储字符串时,首选std :: string。
当然,使用const char*
作为c ++中的数据所有者永远不合适。总有一种更好的方法。从c ++ 98开始就是如此。
答案 1 :(得分:6)
“Invalidate”在这里有技术含义,我认为这是无意的。听起来像是“消除”是预期的词。
您仍然需要生成和使用C字符串才能与常见API进行交互。例如,POSIX具有open
和execve
,Win32具有粗略等价物CreateFile
和CreateProcess
,并且所有这些函数都在C字符串上运行。但最后,您仍然在调用str.data()
或str.c_str()
以便与这些API进行交互,因此无论str
是否为{std::basic_string_view
,C字符串的使用都不会消失{1}}或std::basic_string
。
为了正确使用这些API,您仍然必须了解C字符串是什么。虽然std::string
保证了NUL终结符,但std::string_view
没有,并且两种结构都不能保证字符串内某处没有NUL字节。在任何一种情况下,您都必须在字符串中间清理NUL字节。
这甚至没有触及使用C字符串的第三方库的大量资源,或者使用C字符串改造自己的代码而使用std::string_view
的代码的费用。