为什么没有从 std::string_view 到 std::string 的隐式转换?

2023-12-06

有一个隐式转换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(使用前将#替换为@)

为什么没有从 std::string_view 到 std::string 的隐式转换? 的相关文章

随机推荐