【问题标题】:Why is there no support for concatenating std::string and std::string_view?为什么不支持连接 std::string 和 std::string_view?
【发布时间】:2017-11-22 00:33:28
【问题描述】:

从 C++17 开始,我们有了 std::string_view,这是一种对连续字符序列的轻量级视图,可避免不必要的数据复制。现在通常建议使用std::string_view,而不是使用const std::string& 参数。

但是,很快就会发现从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)

为什么标准中不支持串联std::stringstd::string_view

【问题讨论】:

标签: c++ string c++17 string-view


【解决方案1】:

Jeffrey Yasskin 在n3512 string_ref: a non-owning reference to a string, revision 2 中给出了原因:

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

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

【讨论】:

  • 哇。哇!这似乎是遗漏某些内容的最糟糕可能的原因。该标准应该是为了语言的好处,而不是为了任何特定的实现。我也对“懒惰地执行连接”持谨慎态度——这是否意味着,如果我们有内存短缺,添加到原始字符串的异常会被推迟?我当然希望不会,我想知道执行操作时是否失败,而不是十分钟后我访问结果时。
  • 希望有人提交包含这些运营商的提案。
  • fmtlib/fmt 库中与string_view 配合得很好。
  • std::basic_string::append() 有一个重载,它接受可以隐式转换为std::string_view 的所有内容。当然这和operator+()不一样。
  • 如果需要高效的 c++ 字符串连接(即字符串生成器),这里的评论员会建议哪些替代方案?例如,c# 库有一个高效的 uri_builder 类,它接受一组字符串并使用 to_string() 方法创建一个;如果 string_view 有 +() 重载,则可以实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2022-01-03
  • 1970-01-01
  • 2020-03-24
  • 2018-02-12
相关资源
最近更新 更多