为什么不支持连接std :: string和std :: string_view?

s3r*_*vac 47 c++ string string-view c++17

从C++ 1z开始,我们可以std::string_view轻松地查看连续的字符序列,避免不必要的数据复制.const std::string&现在经常建议使用,而不是使用参数std::string_view.

但是,很快就会发现切换const std::string&std::string_view使用字符串连接的中断代码,因为不支持连接std::stringstd::string_view:

std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile)
std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile)
Run Code Online (Sandbox Code Playgroud)

为什么不支持连接std::stringstd::string_view标准?

pep*_*ppe 28

我已经提交了P2591:字符串和字符串视图的串联,链接到这个问题。本文目前的最低目标是 C++26。

  • C++26?...令人震惊。恕我直言,这应该被视为一个缺陷并追溯应用于 C++17。 (14认同)
  • 这可能不是对该提案的批评应该去的地方,但我注意到您的示例代码将“view”作为“std::string”,而不是“std::string_view”。 (2认同)

vit*_*aut 21

其原因在n3512 string_ref中给出:一个字符串的非拥有引用,由Jeffrey Yasskin 修订版2:

我也省略了operator +(basic_string,basic_string_ref),因为LLVM从这个重载返回一个轻量级对象,只是懒惰地执行连接.如果我们定义这个重载,我们将很难在以后引入轻量级连接.

后来在std-proposals邮件列表中建议将这些运算符重载添加到标准中.

  • 哇.哇哇!这似乎是留下一些东西的最糟糕*可能的原因.该标准应该是*语言的优点,*不适用于任何特定的实现.我也警惕"懒惰地执行连接" - 这是否意味着,如果我们有内存不足,添加到原始字符串的例外也将*延迟?我肯定不希望这样,我想知道当我执行它时操作是否失败,而不是十分钟后我访问结果时. (27认同)
  • @joesdiner那是不安全的,`data`不是以null结尾的,而`const char*`-接受重载则期望它是这样。 (9认同)
  • [`std::basic_string::append()`](https://en.cppreference.com/w/cpp/string/basic_string/append) 有一个重载,它接受可以隐式转换为 `std 的所有内容: :string_view`。当然,这与“operator+()”不同。 (8认同)
  • 希望有人提交包含这些运营商的提案. (3认同)
  • 在[fmtlib / fmt](https://github.com/fmtlib/fmt)库中,`string_view`非常适用。 (2认同)
  • 如果需要高效的 C++ 字符串连接(即字符串生成器),这里的评论者会建议哪些替代方案?例如,C# 库有一个高效的 uri_builder 类,它采用一组字符串并使用 to_string() 方法创建一个字符串;如果 string_view 有 +() 重载,实际上可以实现这一点。 (2认同)