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

时间:2017-03-27 07:48:03

标签: c++ c c++17

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

2 个答案:

答案 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具有openexecve,Win32具有粗略等价物CreateFileCreateProcess,并且所有这些函数都在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的代码的费用。