![](/img/trans.png)
[英]No implicit conversion from std::string to std::string_view in C++17 (was in std::experimental::basic_string_view)
[英]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具有open
和execve
,Win32具有粗略的等价物CreateFile
和CreateProcess
,并且所有这些函数都在C字符串上运行。 但最后,你仍然在调用str.data()
或str.c_str()
以便与这些API进行交互,因此无论str
是std::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.