一种方法是使用类型为`std::string`的参数,然后使用`std::move`:
Foo(std::string str) : _str(std::move(str)) {}
据我所了解,移动字符串只会复制其内部指针,这意味着它基本上是免费的,因此传递一个
const char*
与传递const std::string&
一样有效。但是在C++17中,我们有了std::string_view
,承诺廉价的拷贝。因此,上述内容可以写成:Foo(std::string_view str) : _str(str.begin(), str.end()) {}
不需要移动或构建临时的`std::string`,但我认为它实际上只是与以前一样有效地执行相同的操作。
那么我是否遗漏了什么?还是只是在使用带有移动的`std::string`或`std::string_view`之间只是风格问题?
string_view
应该比原始的char*
稍微快一些,因为它避免了需要调用strlen
的情况。 - Alan Birtleschar*
到std::string_view
的过程中不会调用strlen
吗?如果不是,它是如何知道字符串的长度的? - Object objectstd::string
开始的(实际上在你的问题中并没有明确说明)。 - Alan Birtles