gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:15:36 25 4
gpt4 key购买 nike

存在从 std::stringstd::string_view 的隐式转换,并且它不被认为是不安全的,尽管这肯定会导致大量悬空引用,如果程序员不小心

另一方面,没有使用相同参数但以完全相反的方式从 std::string_viewstd::string 的隐式转换:因为程序员可能不小心

很高兴 C++ 有一个原始 const char* 指针的替代品,同时使它变得 super 困惑并且被剥离到骨头:

  • 隐式const char* -> std::string:确定
  • 隐式std::string_view -> std::string:NOPE
  • 赋值 std::string = const char* : 确定
  • 赋值std::string = std::string_view:确定
  • 附加 std::string += const char* : 确定
  • 附加std::string += std::string_view:确定
  • 串联const char* + std::string:确定
  • 连接std::string_view + std::string:NOPE
  • 串联std::string + const char*:确定
  • 串联std::string + std::string_view:NOPE

我错过了什么还是这完全是胡说八道?

最后,如果没有所有与 const char* 类似的关键部分,这个字符串 View 有多大用处?将其集成到 stdlib 生态系统中而不进行最后一步使其完成有什么意义?毕竟,如果我们需要一个代表字符串片段的对象,我们可以编写自己的对象。事实上,许多图书馆几年前就已经这样做了。制定标准的全部目的是使其适用于最广泛的用例,不是吗?

他们会在C++23中修复这个问题吗?

最佳答案

问题在于 std::string_view -> std::string 生成底层内存的副本,并完成堆分配,而隐式 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& 参数要低!

  • 当使用 std::string 参数调用 foo2 时(例如通过 foo1):当 foo2 时调用 foo3,它会创建字符串的副本。如果它有一个 const std::string& 参数,它就可以使用它已经拥有的对象。
  • 当使用 const char* 参数调用 foo2 时:迟早必须创建 std::string 副本;使用 const std::string& 参数,它会更早制作,但总的来说,无论哪种方式都只有一个副本。

现在想象 foo2 调用多个函数,例如 foo3,或者在循环中调用 foo3;它一遍又一遍地创建完全相同的 std::string 对象。您希望编译器通知您这一点。

关于c++17 - 为什么没有从 std::string_view 到 std::string 的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47525238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com