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