有一个隐式转换std::string
to std::string_view
并且它并不被认为是不安全的,尽管如果程序员这样做肯定可能会导致大量悬空引用不小心.
另一方面,没有隐式转换std::string_view
to std::string
使用相同的论点但以完全相反的方式:因为程序员可能不小心.
很高兴 C++ 有一个原始的替代品const char*
指针,同时使其变得非常混乱并且被剥离到骨头:
- 隐含的
const char*
-> std::string
: OK
- 隐含的
std::string_view
-> std::string
: NOPE
- 任务
std::string
= const char*
: OK
- 任务
std::string
= std::string_view
: OK
- 追加
std::string
+= const char*
: OK
- 追加
std::string
+= std::string_view
: OK
- 级联
const char*
+ std::string
: OK
- 级联
std::string_view
+ std::string
: NOPE
- 级联
std::string
+ const char*
: OK
- 级联
std::string
+ std::string_view
: NOPE
我错过了什么还是这完全是无稽之谈?
最后,如果没有所有使其类似于的关键部分,这个字符串视图有多大用处?const char*
?将其融入到生态系统中有何意义?stdlib而没有完成最后一步来完成它?毕竟,如果我们需要一个代表字符串片段的对象,我们可以编写自己的对象。事实上,许多图书馆几年前就已经这样做了。制定标准的全部目的是使其适用于最广泛的用例,不是吗?
他们会解决这个问题吗C++23?
问题是std::string_view
-> std::string
使一个copy底层内存,完成堆分配,而隐式std::string
-> std::string_view
才不是。如果您费心使用std::string_view
首先,您显然关心副本,因此您不希望副本隐式发生。
考虑这个例子:
void foo1(const std::string& x)
{
foo2(x);
}
void foo2(std::string_view x)
{
foo3(x);
}
void foo3(const std::string& x)
{
// Use x...
}
功能foo2
本来可以用一个const std::string&
参数,但使用了std::string_view
因此,如果您传入的字符串不是std::string
;那里没有什么惊喜。但它的效率比你刚刚给它的效率要低const std::string&
范围!
- When
foo2
被称为std::string
论证(例如通过foo1
): When foo2
calls foo3
,它创建字符串的副本。如果它有一个const std::string&
争论,它可以使用它已经拥有的对象。
- When
foo2
被称为const char*
论据:Astd::string
迟早必须制作副本;与一个const std::string&
它是较早创建的参数,但总的来说,无论哪种方式都只有一个副本。
现在想象一下foo2
调用多个函数,例如foo3
,或调用foo3
循环中;它做的完全一样std::string
一遍又一遍地对象。您希望编译器通知您这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)