繁体   English   中英

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

在设计一个对调用ac API的对象进行封送时,你应该更喜欢std :: string或std :: string const& - 因为它的c_str()方法会正确地产生一个以null结尾的字符串。

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

当然,使用const char*作为c ++中数据的所有者永远不合适。 总有一种更好的方法。 从c ++ 98开始就是如此。

“无效”在这里具有技术含义,我认为这是无意的。 听起来像是“消除”是预期的词。

您仍然需要生成和使用C字符串才能与常见API进行交互。 例如,POSIX具有openexecve ,Win32具有粗略的等价物CreateFileCreateProcess ,并且所有这些函数都在C字符串上运行。 但最后,你仍然在调用str.data()str.c_str()以便与这些API进行交互,因此无论strstd::basic_string_view还是str都不会消失。 std::basic_string

您仍然必须了解C字符串是什么才能正确使用这些API。 虽然std::string保证了NUL终结符,但std::string_view却没有,并且两种结构都不能保证字符串内部没有NUL字节。 在任何一种情况下,您都必须在字符串中间清理NUL字节。

这甚至没有涉及使用C字符串的第三方库的大量资源,或者使用C字符串改造自己的使用std::string_view的代码的std::string_view

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM